`
xmong
  • 浏览: 264173 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java读linux系统文件文件名乱码

阅读更多
1,问题描述
web应用想通过Java读取linux系统文件显示到web页面上,结果中文文件名出现乱码?
问题场景描述:当用户通过浏览器访问tomcat服务器,请求查看某一路径下文件列表信息,tomcat的web应用调用getFilesByPath(String path)方法读取文件列表信息响应请求,页面中文文件名出现乱码。
代码如下:
文件类
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<FileInfo> getFilesByPath(String path){
		
		List<FileInfo> fileList = new ArrayList<FileInfo>();
		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<FileInfo> getFilesByPath(String path){
		
		//获取系统编码
		String encoding = System.getProperty("file.encoding");
		List<FileInfo> fileList = new ArrayList<FileInfo>();
		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<FileInfo> getFilesByPath(String path) throws Exception{
		
		//获取系统编码
		String encoding = System.getProperty("file.encoding");
		List<FileInfo> fileList = new ArrayList<FileInfo>();
		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中压缩与解压--中文文件名乱码解决办法

    ### Java中压缩与解压——中文文件名乱码解决办法 #### 一、问题背景及原理分析 在Java中处理文件的压缩与解压时,经常会遇到中文文件名出现乱码的问题。这个问题主要源于Java中默认使用的编码方式与实际文件名...

    linux下的文件名乱码,转为正常

    这通常是由于文件系统的编码不兼容或者终端的字符集设置不当导致的。解决这个问题涉及到多个方面,包括理解字符编码、查看和设置环境变量以及使用特定的命令行工具。下面将详细介绍如何在Linux下处理文件名乱码问题...

    服务器下载word乱码解决方案(文件名乱码、内容乱码)

    往往开发环境和生产环境在环境部署时会遇到很多奇怪的问题,此次word文档下载就被卡住了,通过一番努力终于...上传文件txt格式,内有方法详细的代码注释及原因说明,jar包比较常见,大家自行导入,希望可以帮到大家。

    Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    在Java编程中,使用FTPClient进行文件传输时,可能会遇到一个常见的问题,即当尝试创建中文目录或上传具有中文名称的文件时,这些目录名和文件名会显示为乱码,通常表现为“??”这样的形式。这个问题主要是由于FTP...

    Java处理中文文件名-压缩中文名字的文件.rar

    在不同的操作系统和文件系统中,对非ASCII字符(如中文字符)的支持方式不同,这可能导致乱码或无法正确读取文件。Java API本身提供了一些处理这种问题的方法,但需要正确理解和使用。 首先,我们要理解Java中的...

    java中FileOutputStream中文乱码问题解决办法

    总之,当使用Java的`FileOutputStream`处理包含中文字符的文本时,需要通过`OutputStreamWriter`将其转换为字符流,并指定正确的字符编码(如UTF-8),这样才能确保中文字符在文件中正确显示,避免出现乱码。

    【文件下载】及解决文件名中文乱码问题

    6. **文件系统兼容**:不同的操作系统对非ASCII字符的支持程度不同,Windows、Linux和macOS在处理中文文件名时可能存在差异。因此,跨平台的应用需要特别注意文件系统的编码兼容性。 7. **编程库和框架**:如果你在...

    下载文件提示框中文乱码

    4. 文件名编码转换:对于文件名乱码,可以使用专门的工具进行转换,如“File Renamer”或“Advanced Renamer”,这些工具能帮助批量转换文件名的编码。 5. 操作系统设置:在Windows系统中,可以通过修改注册表或者...

    linux转化windows文件编码格式脚本

    Linux 转换 Windows 文件编码格式脚本是将 Windows 上的文件编码格式转换为 UTF-8 编码,以便在移植 Windows 代码到 Linux 下时避免注释代码乱码和编码格式引起的编译错误。 该脚本使用 Bash shell 脚本语言编写,...

    fckeditor(java版-解决中文附件名称乱码问题)

    5. **文件命名规则**:不同的操作系统对文件名的编码处理方式不同,Windows和Unix/Linux系统可能存在差异,开发者需要考虑到这些兼容性问题。 6. **服务器环境配置**:服务器的环境配置也可能影响到文件名的处理,...

    Linux系统unzip解压后中文名乱码解决方法.docx

    解决 Linux 系统 unzip 解压后中文名乱码的问题可以使用四种方法:使用 Python 脚本、使用 unzip 命令指定字符集、在环境变量中指定 unzip 参数、使用 Java 的 jar 命令解压 zip 文件。每种方法都可以解决中文名乱码...

    linux、window通用文件解压

    如果ZIP文件包含中文文件名,确保你的Linux系统使用了UTF-8编码,这是大多数现代Linux发行版的默认设置。如果遇到中文乱码问题,可能需要检查并调整locale设置。 2. **在Windows上解压ZIP文件**: Windows操作...

    birt Chart在Linux下中文乱码解决方案

    在Linux环境下,BIRT(Business Intelligence and Reporting Tools)图表组件可能会遇到中文乱码的问题,这主要是由于Java虚拟机无法识别到支持中文字符的字体文件所导致。以下是一种解决该问题的详细步骤: 首先,...

    ckfinder修改文件名称

    原版的CKFinder可能在处理包含中文字符的文件名时遇到困难,尤其是在Linux环境下,因为Linux的文件系统(如EXT4)默认不支持UTF-8编码,这可能导致中文字符显示为乱码。为了解决这个问题,开发者对CKFinder的源代码...

    linux下中文乱码问题.pdf

    对于文件系统的乱码问题,可以使用`ls --show-control-chars`命令来显示包含控制字符的文件名,这有助于在控制台中查看中文文件名。如果系统不支持GBK字符集,可能需要添加支持,如在Ubuntu中,可以通过编辑`/var/...

    smartUpload上传文件包修改后解决中文乱码

    7. **文件系统支持**:某些文件系统(如FAT32)对非ASCII字符支持不佳,升级到支持Unicode的文件系统(如NTFS或ext4)可以避免此类问题。 通过以上步骤,我们通常可以有效地解决SmartUpload在处理中文文件名时的...

    jspsmartupload-解决中文乱码

    最近实验室做了一个项目,使用jspsmartupload来实现的文件的上传下载,原来在windows平台运行的挺好,但是后来系统移植到linux平台上,结果在上传或下载的文件名中有中文时就会出现乱码。后来查了网上一些人的解决...

    zip解压缩乱码的解决方案

    - 对于开发者,可以编写自定义的解压脚本,通过编程语言(如Python、Java)来读取ZIP文件内容,识别并转换文件名的编码后再解压。这种方法适用于需要批量处理和二次开发的情况。 6. **预防措施** - 在创建ZIP文件...

    centos安装中文字体,解决中文乱码

    在提供的压缩包中,有一个名为`simsun.ttc`的文件,这是宋体的TrueType Collection字体,适用于Windows和Mac系统,但在Linux系统中可能需要进行一些转换才能使用。对于.sfc或.ttf格式的字体文件,我们可以使用`ttf2...

    Linux下乱码问题的解决方案小结

    在Linux环境中,尤其是在涉及到与Windows...通过以上策略,可以有效解决Linux系统下的乱码问题,无论是文件名、输入法还是程序显示。在处理多平台交互时,理解并正确处理编码问题至关重要,以免影响正常的工作和沟通。

Global site tag (gtag.js) - Google Analytics