热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java读linux文件名乱码的解决办法

Java读linux文件名乱码的解决办法:首先将linux系统编码修改为“utf-8”;然后通过java程序转码,将系统编码转换为“utf-8”编码即可,代码为“fileInfo.setName(newString)”。

Java读linux系统文件文件名乱码的解决办法

1,问题描述

web应用想通过Java读取linux系统文件显示到web页面上,结果中文文件名出现乱码?

问题场景描述:当用户通过浏览器访问tomcat服务器,请求查看某一路径下文件列表信息,tomcat的web应用调用getFilesByPath(String path)方法读取文件列表信息响应请求,页面中文文件名出现乱码。

推荐教程:《java学习》

代码如下:

文件类

import java.io.Serializable;
import java.util.Date;
public class FileInfo implements Serializable{
/**
* 
*/
private static final long serialVersiOnUID= 1L;
String name;
long size;
Date lastModified;
boolean dir;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public Date getLastModified() {
return lastModified;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
public boolean isDir() {
return dir;
}
public void setDir(boolean dir) {
this.dir = dir;
}
}

java代码如下:

/**
* 根据path路径查找出该路径下可视文件列表
* @param path
* @return
*/
public List getFilesByPath(String path){
List fileList = new ArrayList();
File file = new File(path);
/**
* 查找可视文件列表
*/
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return !f.isHidden();//过滤隐藏文件
}
});
/**
* java文件类型转换为web显示文件类
*/
for (File f : files) {
FileInfo fileInfo = new FileInfo();
fileInfo.setName(f.getName());
fileInfo.setSize(f.length());
fileInfo.setLastModified(new Date(f.lastModified()));
                     fileInfo.setDir(f.isDirectory());
}
return fileList;
}

当将读取文件信息显示到web页面上时,中文文件名出现乱码。

2,解决方案

web系统调用该方法读取文件列表后,中文命名的文件或文件夹显示为乱码。出现乱码往往都是数据流编码不一致导致的,检查数据流编码,首先查看tomcat服务器和页面显示编码都是utf-8编码,在查看linux系统编码为iso-8859-15,当然我们也知道java默认采用的是Unicode编码,但这种默认Unicode编码不是我们想要的utf-8编码,所以我们需要自己转码。

解决方案1:

将linux系统编码修改为utf-8,该方案比较简单,不过要求用户有系统root权限才可以修改。

解决方案2:

通过java程序转码,将系统编码转换为utf-8编码。

/**
* 根据path路径查找出该路径下可视文件列表
* @param path
* @return
*/
public List getFilesByPath(String path){
//获取系统编码
String encoding = System.getProperty("file.encoding");
List fileList = new ArrayList();
File file = new File(path);
/**
* 查找可视文件
*/
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return !f.isHidden();
}
});
/**
* java文件类型转换为web显示文件类型
*/
for (File f : files) {
FileInfo fileInfo = new FileInfo();
try {
//将系统编码encoding转换为utf-8编码
fileInfo.setName(new String(f.getName().getBytes(encoding),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
fileInfo.setSize(f.length());
fileInfo.setLastModified(new Date(f.lastModified()));
                       fileInfo.setDir(f.isDirectory());
}
return fileList;
}

页面显示文件名正常,但path参数在遍历文件的时候中文出现了乱码,导致路径不存在。

解决方法是将path参数从utf-8转换为系统编码,再根据path去遍历文件。

/**
* 根据path路径查找出该路径下可视文件列表
* @param path
* @return
*/
public List getFilesByPath(String path) throws Exception{
//获取系统编码
String encoding = System.getProperty("file.encoding");
List fileList = new ArrayList();
try {
//将path路径转码为系统编码
File file = new File(new String(path.getBytes("UTF-8"),encoding));
//判断文件路径是否存在,是否有读权限,如不存在或者没有权限则抛出异常
if(file.exists() && file.isDirectory() && file.canRead()){
/**
* 查找可视文件
*/
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return !f.isHidden();
}
});
/**
* java文件类型转换为web显示文件类型
*/
for (File f : files) {
FileInfo fileInfo = new FileInfo();
//将系统编码encoding转换为utf-8编码
fileInfo.setName(new String(f.getName().getBytes(encoding),"UTF-8"));
fileInfo.setSize(f.length());
fileInfo.setLastModified(new Date(f.lastModified()));
fileInfo.setDir(f.isDirectory());
}
}else{
throw new Exception("Paht:"+path+", exists:"+file.exists()+", canRead:"+file.isDirectory());
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
return fileList;
}

这样就可以解决java读linux系统文件名乱码问题。。。

解决乱码问题就是从源头追溯的显示,一路纠结编码就这么简单。。。

以上就是Java读linux文件名乱码的解决办法的详细内容,更多请关注其它相关文章!


推荐阅读
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文总结了淘淘商城项目的功能和架构,并介绍了传统架构中遇到的session共享问题及解决方法。淘淘商城是一个综合性的B2C平台,类似京东商城、天猫商城,会员可以在商城浏览商品、下订单,管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。商城的架构包括后台管理系统、前台系统、会员系统、订单系统、搜索系统和单点登录系统。在传统架构中,可以采用tomcat集群解决并发量高的问题,但由于session共享的限制,集群数量有限。本文探讨了如何解决session共享的问题。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
马佳叮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有