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

发布时间 - 2020-04-07 00:00:00    点击率:

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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何处理CORS跨域请求?(配置示例)  千库网官网入口推荐 千库网设计创意平台入口  详解Android图表 MPAndroidChart折线图  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何配置Horizon来管理队列?(安装和使用)  如何构建满足综合性能需求的优质建站方案?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何登录建站主机?访问步骤全解析  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  奇安信“盘古石”团队突破 iOS 26.1 提权  香港服务器网站推广:SEO优化与外贸独立站搭建策略  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何配置和使用缓存?(Redis代码示例)  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作企业网站建设方案,怎样建设一个公司网站?  android nfc常用标签读取总结  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何在腾讯云服务器上快速搭建个人网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  MySQL查询结果复制到新表的方法(更新、插入)  jQuery validate插件功能与用法详解  Windows Hello人脸识别突然无法使用  轻松掌握MySQL函数中的last_insert_id()  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  jquery插件bootstrapValidator表单验证详解  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何基于云服务器快速搭建个人网站?  如何确保FTP站点访问权限与数据传输安全?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  JavaScript中的标签模板是什么_它如何扩展字符串功能  黑客入侵网站服务器的常见手法有哪些?  油猴 教程,油猴搜脚本为什么会网页无法显示?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  在线教育网站制作平台,山西立德教育官网?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  如何在腾讯云免费申请建站?  Laravel如何实现数据库事务?(DB Facade示例)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel如何为API编写文档_Laravel API文档生成与维护方法  装修招标网站设计制作流程,装修招标流程?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何快速生成专业多端适配建站电话?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  微信小程序 input输入框控件详解及实例(多种示例)