Java io 虽然支持指定“编码格式”,但是并非所有的编码格式都支持,ansi编码格式不在其支持的范围内
因为你看的是免费的
字符流,读出来是个字符啊,一串字符不就是字符串了吗
这应该不会说不是文本内本来就有?吧
我估计是int 类型强转 char类型出错了,你可以搜搜为啥
读一个 字节 低八位 后面大转小 强转
字符流对多国语言支持性较好,比如中文
你不贴代码,我怎么知道你错在哪里?
找不到路径要么是后缀名没写或者写错了?
我之前遇到过这个问题,你检查一下这两个方法有没有写对
object.mkdir();//创建文件夹
object.createNewFile();//是创建文件
老师写的是字符串数数组,将读取的内容放在字符串数组中,不需要缓冲区
当你使用BufferedInputStreams时候需要用到缓冲区,这个时候在写.fiush();
下载的是一个eclipse项目,可以用eclipse打开,单独打开一个.java文件的话,也可以用记事本
阿西吧
在第二次循环时,read使得字符数组的前一部分读入了数据,后面剩余的部分的数据没有改变,然后foreach打印了整个字符数组
恩 问题解决了 谢谢!
我的理解是的;IO流只是通道; 后面主要需要学习对各种类型文件的读写;特定函数的读写;
char是单字符,int是整型 int和char根本不是一个性质
流是计算机中用于在两个设备或者库之间传递数据的形式。
以计算机打开一个文档并显示出来为例:
文档实际上是由很多字符构成的集合,而且这些字符间是有顺序的。当你打算打开它的时候,计算机要从硬盘上读取到文件,然后一行一行传给显示设备。你可以想象,系统从文件中由起始位置开始不断取出数据,像水一样通过管道流到显示设备这里。这就是流,确切说这一个是文件流。那么你想,既然流动,就需要管道。我们说管道就是缓冲区。实际上就是将数据先读取到缓冲区,然后显示设备从缓冲区中读取数据。这个概念懂了,咱们说下面的。
显示设备获取数据通常是等缓冲区被填满以后。但是实际上有些时候我们单次想传递的数据并没有缓冲区这么大,那么就需要刷新一下缓存,强制将缓存中的流数据推到显示设备中。
char是两个字节16位,8*1024是8*1024个字节容量的数组,数组只是批量读取的容器
你的编码格式是不是不一样
比如你的doc文档是utf-8
你的编程软件默认编码是gbk
fis.read()方法的返回值是什么?弄清楚这个你就明白了。返回值是int类型的整数,当read()完文件内容,就会返回-1。我是这么理解的。
是不是你读的docx文件本身不是gbk编码,是其他的编码方式?
c是整型,打印出来是一串整数 除非文件中没有内容
更改打印的编码
如果你有下载源码的话 你按住 ctrl+鼠标左键 就能查看源码了
InputStreamReader 里面有几个构造函数
public InputStreamReader(InputStream in){}
public InputStreamReader(InputStream in, String charsetName){}
public InputStreamReader(InputStream in, Charset cs){}
只有这三个 所以当然要...你说的那个
要创建一个实例对象,当然要使用构造函数,所以必须传入 FileInputStream的对象 你可以直接
InputStreamReader isr=new InputStreamReader(new FileputStream("e:\\javaio\\imooc.txt"));
其实java中很多类都是新定义,应用了一些比较简单的类,比如冒泡排序法,字母大小写转化,写成全新的类就可以很方便使用了.
你重新建立一个一样的txt文件,然后复制内容,不要修改文件的编码格式试下。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("请输入1和2");
int a;
while(true){
a=input.nextInt();
if(a!=1&&a!=2){
System.out.println("输入不正确,请输入1和2");
}else break;
}
System.out.println("输入正确!");
}
}
老师的解释:
(1)认识文本和文本文件
java的文本(char)是16位无符号整数,是字符的unicoid编码(双字节编码)
文件是byte byte byte 的数据序列
文本文件是文本(char)序列按照某种(utf-8,utf-16be,gdk)序列化为byte的存储结果
1M=1024KB,1Kb=1024B,不一定是8,也可以大或者小,要取决于你要操作的文件的大小
以解决了。。。。。。
c表示当前读取到的字节 。
1、
c = isr.read() Reads a single character 读取单个character
the next byte of data, or -1 if the end of the file is reached
返回下一个next byte of data
2、
c = isr.read(byte[] , start,len) Reads characters into a portion of an array 读取多个charachters
返回the total number of bytes read into the buffer, or -1 if there is no more data because the end of the file has been reached.
返回total所有的number,也就数量
The character read, or -1 if the end of the stream has been reached
如果流读取结束,将返回-1
The number of characters read, or -1 if the end of the stream has been reached
如果流读取结束,返回-1
所以read()不是表示读取的计数,或者位置,表示下一个byte.
/****************************************常用用法
byte[] b = new byte[8 * 1024];// 8kb
// System.out.println(b.length);
// new byte
int a = 0;
FileOutputStream out = new FileOutputStream(destfile);
while ((a = in.read(b, 0, b.length)) != -1) {
out.write(b, 0, a);
out.flush();// 最好加上
这里的a表示总共。total的计数。
可以看下out.write(b,off,len);的讲解
Writes len bytes from the specified byte array starting at offset off to this file output stream.
从off位置开始,从流读取长度为lend的byte到b里面
Overrides: write(...) in OutputStream
Parameters:
b the data. 数据
off the start offset in the data. 从b的start位置开始
len the number of bytes to write. 读取长度为len的byte数据 ,也就是返回的in.read(b,0,b.length)
}
一般要恢复什么东西他都是要有备份文件的。