一个小程序读写文件,发现PrintWriter输出后文件存在乱码,解决办法主要统一输入输出流编码格式。
读文件:
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
可以对使用 DataInputStream 进行按原文输入的程序进行本地化,方法是用合适的 BufferedReader 替换每个 DataInputStream。
为了指定文件的编码方式,再进入如下修改:
//BufferedReader in = new BufferedReader(new FileReader(saveFilename));
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(saveFilename),"GB2312"));
写文件:
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。
通常 Writer 将其输出立即发送到基础字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,
PrintWriter out
= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
为了指定文件的编码方式:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFilename),"GB2312")));
分享到:
相关推荐
- 使用`System.out.println()`打印文件内容,观察是否有乱码,以帮助定位问题。 - 使用`java.nio.charset.CharsetDetector`类检测文件的实际编码。 7. **总结**: - 解决Java处理CSV文件时的中文乱码问题,关键...
### Java Filter 打印请求返回参数详解 #### 一、背景与目的 在Web开发过程中,经常需要在请求处理流程中增加一些通用的功能,比如日志记录、性能监控、安全控制等。Java Servlet规范提供了Filter机制来实现这些...
如果文件使用的编码方式与程序默认的编码方式不一致,可能导致乱码问题。因此,在创建`InputStreamReader`或`FileWriter`时,可以显式指定字符集,如`UTF-8`。 通过以上分析可以看出,Java中的输入输出操作非常灵活...
Java Web 学习之 Request 对象中 GET 和 POST 的差异 摘要:本文将对 Java Web 中 Request 对象中 GET 和 ...同时,我们应该注意到 servlet 作为控制器是不应该输出内容的,我们应该把要打印的内容放到 JSP 文件中。
此外,`PrintWriter` 类提供了更灵活的输出控制,例如关闭自动换行。 6. **序列化**: - Java的序列化机制允许将对象的状态保存到文件,然后在需要时恢复。对象需要实现 `Serializable` 接口,使用 `...
还有如`DataInputStream`和`DataOutputStream`用于处理基本数据类型,以及`PrintStream`和`PrintWriter`用于打印输出。 总之,Java的IO流系统提供了丰富的类和接口,用于处理各种输入输出任务。了解并熟练掌握这些...
- `BufferedReader与PrintWriter`:为了提高效率,通常使用BufferedReader进行字符流的读取,而使用PrintWriter进行打印输出,这在处理文本数据时非常方便。 4. **数据编码与解码**: - `字符编码`:在网络通信中...
调试方面,对于初学者来说,使用System.out.println()打印关键信息是一种简单实用的方法。这有助于在运行时查看程序状态,尤其是在验证数据流的正确性时非常有用。 在实际编程中可能会遇到一些问题,例如HTTP服务器...
- **PrintStream/PrintWriter**: 打印流,用于控制台输出或文件输出。 - **PipedInputStream/PipedOutputStream**: 管道流,用于线程间通信。 - **SequenceInputStream**: 序列流,用于连接多个输入流。 - **...
在Java Web应用中,为了避免response.getWriter().write()方法输出时产生乱码,应当在调用getWriter()方法之前设置正确的字符编码,具体做法如下: ```java response.setContentType("text/html;charset=UTF-8"); ...
- `PrintStream`和`PrintWriter`:方便地打印数据,`PrintStream`不会抛出IOException,而`PrintWriter`则用于打印格式化的文本,不会自动处理二进制数据。 5. **使用注意事项** - 在处理包含中文字符的数据时,...
2. **打印流** - `PrintStream` 和 `PrintWriter`: 用于标准输出和格式化的打印操作。 3. **管道流** - `PipedInputStream` 和 `PipedOutputStream`: 实现进程间通信的一种机制。 4. **序列流** - `...
import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ...
- 当处理包含汉字的请求时,由于编码问题可能会导致乱码。为了避免这种情况,需要将获取的字符串先按照ISO-8859-1编码,然后解码为正确的字符集,例如GBK或UTF-8。 2. **response对象**: - response对象代表HTTP...
首先,我们需要在Struts2的配置文件(通常是struts.xml)中定义一个Action,这里定义了一个名为`test`的Action,对应的Java类为`TestAction`。这个Action继承自`ActionSupport`,这是Struts2提供的基础支持类,包含...
- `PrintWriter`:类似`PrintStream`,但适用于字符流。 - **管道流**: - `PipedInputStream`:从管道读取数据。 - `PipedOutputStream`:向管道写入数据。 - **序列流**:`SequenceInputStream`用于合并多个...
os = new PrintWriter(filename); while (sc.hasNext()) { os.write(sc.nextLine()); } } catch (ClientProtocolException e) { e.printStackTrace(); } finally { if (sc != null) { sc.close(); ...