文档章节

java字符流处理文件,编码问题

o
 osc_wws45aot
发布于 2019/08/21 16:07
字数 767
阅读 12
收藏 0

精选30+云产品,助力企业轻松上云!>>>

@[toc]

字节流和字符流的区别?

1.字节流处理 换行 等字符不方便

2.字节流在 处理 文本文件的时候,如果做了人为的类型转换,很可能会出现乱码

3.字节流不能够处理编码问题

4.针对读取一行或者读取一部分的操作不方便

编码、解码

  • 编码: 将字符/字符数组/字符串 转换成 二进制
  • 解码: 将二进制 转换成 字符/字符数组/字符串
  • 编码表: 字符和十进制数值对应的一张表而已

为什么会产生乱码?

1.服务器,客户端,数据库,文件系统之间的编码和解码使用的编码表不一致 (沟通)

2.人为在使用字节流读取的过程中做了转换 (使用字符流解决)

编码解码的三种情况

1.处理字符情况

    // 1.处理字符情况
    char ch = 'a';
    // 编码
    System.out.println((int)ch);

    int i = 97;
    // 解码
    System.out.println((char)97);

2.处理字符串情况

		// 2.处理字符串情况
		String s = "中国Hello";
		// 编码
		byte[] bys = s.getBytes("UTF-8");
		System.out.println(Arrays.toString(bys)); // [-42, -48, -71, -6, 72, 101, 108, 108, 111]
		
		// 解码
		String ss = new String(bys, "UTF-8");
		System.out.println(ss);

3.处理文本文件情况

OutputStreamWriter(转换流,是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认字符集编码。)

OutputStreamWriter(OutputStream out)  创建使用默认字符编码的字符输出转换流

OutputStreamWriter(OutputStream out, Charset cs)  创建使用cs字符集的字符输出转换流

OutputStreamWriter(OutputStream out, CharsetEncoder enc)  创建使用enc字符集编码器的

OutputStreamWriter(OutputStream out, String charsetName)  创建使用指定字符集的

Writer append(char c) 
		将指定字符添加到此 writer。 
Writer append(CharSequence csq) 
		将指定字符序列添加到此 writer。 
Writer append(CharSequence csq, int start, int end) 
		将指定字符序列的子序列添加到此 writer.Appendable。 
abstract  void close() 
		关闭此流,但要先刷新它。 
abstract  void flush() 
		刷新该流的缓冲。 
void write(char[] cbuf) 
		写入字符数组。 
abstract  void write(char[] cbuf, int off, int len) 
		写入字符数组的某一部分。 
void write(int c) 
    	写入单个字符。 
void write(String str) 
    	写入字符串。 
void write(String str, int off, int len) 
    	写入字符串的某一部分。 
    String s = "HelloWorld";
    Writer w = new OutputStreamWriter(new FileOutputStream("out.txt"),"utf-8");
    w.write(s);
    w.append("good");
    w.append("morning");
    w.append('a');
    w.write(new char[] {'a','b','c'});
    w.write("中国你好");
    w.flush();
    w.close();

转换字符输入流

int read() 读取单个字符。

int read(char[] cbuf) 将字符读入数组。

abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。

    Reader r = new InputStreamReader(new FileInputStream("out.txt"), "UTF-8");		
    char[] chs = new char[5];
    int len = 0;
    while ((len = r.read(chs)) != -1) {
        System.out.println(new String(chs, 0, len));
    }

字符流拷贝一个文件

    InputStreamReader isr = new InputStreamReader(new FileInputStream("test.java"));
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"));

    int len = 0;
    char[] chs = new char[1024];

    while ((len = isr.read(chs)) != -1) {
        osw.write(chs, 0, len);
        osw.flush();
    }

    isr.close();
    osw.close();
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
MenuItem 显示中文乱码问题解决方案

MenuItem 显示中文乱码问题解决方案 今天在使用Java做系统托盘图标(TrayIcon),需要为其增加一个右键弹出菜单(PopupMenu),在使用菜单项(MenuItem)时,遇到了一个非常痛苦的事情:中文乱码~...

Java编程思想
2013/10/17
689
0
理解JAVA的IO

什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一...

osc_xucwolsl
2019/03/13
5
0
Java IO编程之文件处理归纳

前言 如何处理IO Java提供5大基本类用以处理文件和流 File类 4大基本抽象Stream数据流类 字节流 字符流 转换流—-字节字符流间的转换 读写优化—处理流 缓冲流 BufferedReader BufferedWrite...

osc_3www0d3o
2018/07/10
2
0
Java IO 讲解

一、java io 概述 1.1 相关概念 Java IO:Java IO即Java 输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素...

SoWhat1412
04/19
13
0
java_io起步

#Java IO流总结 java 的io系统简单介绍 io体系 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable ...

osc_zh10j2cp
2019/09/08
1
0

没有更多内容

加载失败,请刷新页面

加载更多

Asp.net core之NLog

NuGet添加 NLog.Web.AspNetCore。 <PackageReference Include="Microsoft.AspNetCore.App" /> 添加配置文件 新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性......

一介草民Coder
8分钟前
0
0
.NET中的struct和class有什么区别? - What's the difference between struct and class in .NET?

问题: .NET中的struct和class有什么区别? 解决方案: 参考一: https://stackoom.com/question/3OT/NET中的struct和class有什么区别 参考二: https://oldbug.net/q/3OT/What-s-the-differ...

富含淀粉
50分钟前
23
0
android:layout_weight是什么意思? - What does android:layout_weight mean?

问题: I don't understand how to use this attribute. 我不明白如何使用这个属性。 Can anyone tell me more about it? 谁能告诉我更多关于它的事情? 解决方案: 参考一: https://stacko...

javail
今天
17
0
CSS背景不透明度[重复] - CSS Background Opacity [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: How do I give text or an image a transparent background using CSS? 如何使用CSS为文本或图像提供透明背...

fyin1314
今天
31
0
node http 获取gb2312网页如何转为utf8

最初,我想当然认为是下述做法,但被证明是错误的 const http = require('http'), iconv = require('iconv-lite');const url = 'http://xxx';http.get(url, function(res) { var bo......

高延
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部