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 nam
e;
}
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 ListgetFilesByPath(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 ListgetFilesByPath(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 ListgetFilesByPath(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输入框控件详解及实例(多种示例)


e;
}
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;
}
}