java输入,输出的字符编码问题

我们读取文本(无论从那儿读,键盘,硬盘)的时候:

尽量使用:

(从硬盘读)InputStreamReader ir=new           InputStreamReader(fileInputStream,"编码");

(从键盘读)InputStreamReader ir=new InputStreamReader(System.in,"编码");

可以指定编码。

输出文本时,

(输出到硬盘)PrintStream ps=new PrintStream(fileInputstream,"编码");

(输出到显示器)Sytem.out.(不用再指定编码,系统用的是默认,输出也用默认。)

我们读文件(从硬盘)是这样:从    二进制----字符。

我们输出文件(向硬盘)是这样:从    字符----二进制。

打印在屏幕上:  字符----(指定编码)--二进制--(这个过程是控制台的解码)--字符(我们看到的)

内存从键盘读入是这样:

字符--(这个过程是系统的编码)--二进制--(我们指定解码)--字符(内存读到的)

特殊之处,看下边这个例子:

class ReadIn

{

public static void main(String[] args) throws IOException

{

BufferedReader bufr=new BufferedReader(

new InputStreamReader(System.in,"utf-8"));

BufferedWriter bufw=new BufferedWriter(

new OutputStreamWriter(System.out,"utf-8"));//

String line=null;

while((line=bufr.readLine())!=null)

{

if("over".equals(line))

break;

bufw.write(line.toUpperCase());

bufw.newLine();

bufw.flush();

}

bufr.close();

}

}

程序运行结果 :

你好

???

锟斤拷锟?

解释:你好  是我们输入的。

在读取的过程中,我们指定为uft-8来解码,

你好的gbk码[-60,-29,-70,-61]  --按照utf-8 来解码,---(没找到符合utf-8规则的数据),就解成了???

解错了的字符(就是上边的???) --按照utf-8 来编码---[-17,-65,-67,-17,-65,-67,-17,-65,-67]

[-17,-65,-67,-17,-65,-67,-17,-65,-67]--在终端,按照gbk----锟斤拷锟?

时间: 2024-12-17 12:32:03

java输入,输出的字符编码问题的相关文章

Java 输入/输出 反射

Java  输入/输出   反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一个文件,当向其中写数 据时,它就是一个输出流:当从其中读取数据时,它就是一个输 入流.当然,键盘只是一个数人流,而屏幕则只是一个输出流. java 的标准数据流: 标准输入输出指在字符方式下 (如 DOS ) , 程序与系统进行交互的方式,分为三种: 标准输入 studin, 对象是键盘. 标准输出

java中的常用字符编码ASCII、Unicode和UTF-8

首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCI

Java 输入/输出(I/O)学习笔记 -- 文件输入与输出

在保存数据时,可以选择二进制格式或文本格式.例如,整数 1234 存储成二进制数时,它被写为由字节 00 00 04 D2 构成的序列(十六进制表示法) ,而存储成文本格式时,它被存成了字符串" 1234" .尽管二进制格式的 I/O 高速且高效,但是不宜人来阅读. 读写文本数据 在存储文本字符串时,需要考虑字符编码(character encoding)方式.在 UTF-16 编码方式中,字符串" 1234"编码为 00 31 00 32 00 33 00 34

Java 输入/输出(I/O)学习笔记 -- 流

在 Java API 中,可以从其中读入一个字节序列的对象称做输入流,而可以向其中写入一个字节序列的对象称做输出流.这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块.抽象类 InputStream 和 OutputStream 构成了输入 / 输出(I/O)类层次结构的基础. InputStream 类有一个抽象方法: abstract int read() 这个方法将读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回 -1.在设计具体的输入流

Java处理不同的字符编码流

在实际开发中,可能会处理一些文本信息,我们可能使用 BufferedReader bfr = new BufferedReader(new InputStreamReader(bis,encoding)); 这样的方式来处理输入流,然后就可以一行一行的处理信息了. 但是,这里的encoding一般都不会确定,有的是GBK格式,有的是UTF-8格式,可能还有其他格式的文件. 这时候,处理的方式很多,现在给大家介绍一种亲测有效的方法. 原理:使用文本文件头部信息,来确定使用哪种字符编码. 比如,UT

Java 输入/输出——流体系(处理流)

关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单:(2)使用处理流执行效率更高. 下面程序使用PrintStream处理流来包装OutputStream,使用处理流后的输出流在输出时将更加方便. 1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class PrintStreamTest { 6 7 public static void main(String[] arg

Java工具类-设置字符编码

package common; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResp

Java 输入/输出——File类

File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成.值得指出的是,不管是文件还是目录都是使用File来操作的,File能新建.删除.重命名文件和目录,File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入/输出流. File类相关的方法参考链接:https://docs.oracle.com/javase/9/docs/api/overview-summary.html Field Summary Fie

Java 输入/输出——重定向标准输入/输出

在System类中提供了如下三个重定向标准输入/输出方法. static void setErr?(PrintStream err) Reassigns the "standard" error output stream.(重定向"标准"错误输出流) static void setIn?(InputStream in) Reassigns the "standard" input stream.(重定向"标准"输入流) st