Java底层代码实现单文件读取和写入(解决中文乱码问题)

需求

将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv"。

代码

public class FileOpe {
	public static void main(String[] args) {
		sigle();
	}
	public static void sigle(){
		BufferedReader bufr = null;
		BufferedWriter bufw = null;
		try {
			FileReader fr = new FileReader( "E:/data/车站一次/阿坝藏族羌族自治州.csv");
			bufr = new BufferedReader(fr);
			FileWriter fw = new FileWriter( "E:/data//车站一次.csv",true);
			bufw = new BufferedWriter(fw);
			String line = null;
			while((line=bufr.readLine())!=null){
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				if(bufr!=null)
					bufr.close();
				if(bufw!=null)
					bufw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

但是,这样写程序会出现乱码问题,在用Java程序读写含中文的文件时,经常会出现乱码问题。

这是因为系统的编码和程序的编码采用了不同的编码格式。通常,windows自身擦采用的编码格式是gbk,

而IDE中Encode默认是utf-8的编码,这就是为什么会出现乱码的原因。为了避免可能得中文乱码问题,

最好在文件读取和写入的时候显式指定编码格式。

读文件

public static String readFile(String fileName){
	String fileContent = null;
	BufferedReader bufr = null;
	try{
		File f = new File(fileName);
		InputStreamReader read = new InputStreamReader(new FileInputStream(f),"gbk");
	    	bufr= new BufferedReader(read);
	    	String line = null;
	    	while ((line = bufr.readLine()) != null){
	    		fileContent += line;
	    	}
	    } catch (Exception e)
	    {
	    	e.printStackTrace();
	    } finally{
		read.close();
	    }
	    return fileContent;
	} 

写文件

public static void writeFile(String fileName, String fileContent){
	BufferedWriter bufw = null;
	try{
		File f = new File(fileName);
		OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(f),"gbk");
		bufw = new BufferedWriter(write);
		bufw.write(fileContent);
	} catch (Exception e)
	{
		e.printStackTrace();
	} finally{
		bufw.close();
	}
}

解决乱码问题后,代码如下

public class FileDemo {
	public static void main(String[] args) {
		BufferedReader bufr = null;
		BufferedWriter bufw = null;
		try {
			FileInputStream in = new FileInputStream("E:/data/车站一次/阿坝藏族羌族自治州.csv");
			InputStreamReader insr = new InputStreamReader(in, "gbk");
			bufr = new BufferedReader(insr);
			FileWriter fw = new FileWriter("E:/data/a.csv", true);
			bufw = new BufferedWriter(fw);
			String line = null;
			while((line=bufr.readLine())!=null){
				bufw.write(line);
				bufw.newLine();
				bufw.flush();
			}
			bufr.close();
			bufw.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

这样就不会出现乱码问题。

Java底层代码实现单文件读取和写入(解决中文乱码问题)

时间: 2024-10-05 11:02:44

Java底层代码实现单文件读取和写入(解决中文乱码问题)的相关文章

Java底层代码实现多文件读取和写入

需求: "E:/data/"目录下有四个文件夹,如下: 每个文件夹下有几个.csv文件,如下: 将每个文件夹下的.csv文件合并成一个以该文件夹命名的.csv文件. 做法: 找到"E:/data"这个目录,循环读取目录下的四个文件夹: 针对每个文件夹,循环读取目录下的文件列表: 将读取的文件写入要合并的文件中. 代码: public class FileOperation { public static void main(String[] args) { comb

Apache commons-io实现单文件读取和写入

Apache commons-io提供了很多类,这里只介绍FileUtils类. FileUtils类提供了一些操作文件对象的实用方法,包括文件的读取.写入.复制和比较等. 比如逐句读取和写入一个文件可以使用如下方法: File file = new File("E:/data/a.csv"); List lines = FileUtils.readLines(file,"UTF-8"); FileUtils.writeLines(file2, lines, tru

Apache commons-io实现多文件读取和写入

需求: "E:/data/"目录下有四个文件夹,如下: 每个文件夹下有几个.csv文件,如下: 将每个文件夹下的.csv文件合并成一个以该文件夹命名的.csv文件. 做法: 找到"E:/data"这个目录,循环读取目录下的四个文件夹: 针对每个文件夹,循环读取目录下的文件列表: 将读取的文件写入要合并的文件中. 代码: package com.file_readwrite; import java.io.File; import java.io.IOExceptio

java解压多目录Zip文件(解决中文乱码问题)--转载

原文地址:http://zhangyongbo.iteye.com/blog/1749439 import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zi

java:I/O 一行一行读取和写入

BufferedReader逐行读取 import java.io.*; class Test { public static void main(String args []){ FileReader reader =null; BufferedReader bufferedReader =null; try{ reader = new FileReader("e://d/from.txt"); bufferedReader = new BufferedReader(reader);

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

OPENDATASOURCE读取远程数据库数据中文乱码问题-sqlserver R2

insert into kraft_sync_Store(StoreName,StoreCode,Province,PrefectureCity,CountyCity,Region,Area,Unit,HQKA,KAName,StoreType,IsValid,ContactPerson,MobileTelephone,Telephone,Address,Latitude,Longitude,regiongroup,sfastoremanagername) Select CAST(storena

PHP读取mssql,json数据中文乱码

PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码(936,即GBK编码) 当读取数据库数据时,使用php自带的json_encode()返回到前端,结果中文不显示. 解决办法: <?php header("Content-Type: text/html;charset=utf-8"); //告诉浏览器不要缓存数据 header("Cache-Control: no-cache"); require "../conn.