-
文件路径分隔符查看全部
-
java通过RandomAccessFile类实现对文件的访问(访问文件的方式有两种:读写和只读)。 java的文件:在硬盘上文件是以字节的形式存储的。文件中的字,字母和数字都是按字节形式存储的。查看全部
-
java中,使用java.io.File类用来表示文件或目录,但是File类不提供访问文件的功能。查看全部
-
java中jbk编码,中文汉字占用2个字节,英文字母和数字占用1个字节。 在utf-8编码中中文汉字占用3个字节,英文字母和数字一样占用1个字节。 java是双字节编码,编码格式是utf-16be。在utf-16be编码中,汉字,英文字母和数字都是占用两个字节的。比如String str= "慕课sfdsa123";java会给str中的每一个字符都分配2个字节,‘幕’和‘课’就会将这两个字节用完,而英文字母和数字高字节为0,低字节就是字母或数字的编码了。查看全部
-
(5)序列化中子类和父类构造函数的调用问题 一个类实现了序列化接口,则其子类可以直接序列化,且构造函数会被递归调用 对子类对象进行反序列化操作时,其父类没有实现序列化接口,则其父类的构造函数会直接被调用。 理解一下,是这样的: 子类继承了分类的属性和方法,于是在声明子类时,从父类那里继承来的属性和方法,如果不需要改写的话,也就不需要再写出来。而这些从父类哪里继承来的属性和方法,的厨师话,是由父类的构造函数完成的。正常情况下,一旦创建一个子类对象,就会调用其父类的构造函数初始化子类从父类那里继承来的属性。 序列化操作会把一个对象的相关属性写进一个文件中,反序列化则是从一个文件中把一个对象的属性读出来,还原一个对象,其效果是出现了一个对象。而一旦出现了一个对象就是需要调用相关的构造函数。如果说,父类实现了序列化接口,=则子类从父类哪里继承来的属性也会序列化到文件里,反序列化时会一起读出来,但是如果父类没有实现序列化接口,那么子类对象序列化到一个文件中后,再次反序列化时,子类对象从父类哪里继承来的属性的值,必须要使用父类的构造函数,重新构造出来。想想也能认可,这样做是很合理的。查看全部
-
transient 关键字<br> private transient int stuage;<br> 关键字之后jvm就不会再去默认的序列化 stuage 属性,但并不是说就不能序列化了,这时可以手动的序列化<br> //手动实现序列化<br> private void writeObject(java.io.ObjectOutputStream s)<br> throws java.io.IOException<br> {<br> s.defaultWriteObject(); //能默认序列化 的 就先默认序列化<br> s.writeInt(stuage); //序列化一个用transient修饰的属性<br> }<br> //手动实现反序列化<br> private void readObject(java.io.ObjectInputStream s)<br> throws java.io.IOException, ClassNotFoundException<br> {<br> s.defaultReadObject(); //把虚拟机能默认的放序列化元素反序列化<br> this.stuage = s.readInt(); //手动完成 stuage (被transient修饰的属性)<br> <br> }<br> 上面的方签名是记不住,可以随便写一个实现了上面方法的类,比如ArrayList,选中之,F3即可查看源码,ctrl F 即可查找到,复制出来就能直接使用 是不是努着没事找事,明明可以默认序列化,为什么还要手动序列化,倒弄一圈这不是自找麻烦吗,使用Student这个例子是看不出来的,最好还是打开ArrayList的源码来看看。 ArrayList中疯转了对数组的操作,其内部就是有一个数组,数组里面是可以有很多的元素的,一个数组,即便是没有存满元素,但是每一个数组元素也会有一个默认的值。如果使用jvm的默认序列化的话,这样将会把数组中那些带有默认值的元素也一块序列化,这样不是就浪费了。如果可以自己手动序列化的话,我就可以有选择的型的序列化,只把数组中存储的元素序列化,别的空数组元素则不需要序列化。查看全部
-
public void list (String path){ File file = new File(path); File[] list = file.listFiles(); for(File i :list){ if(i.isFile()){ System.out.println(i); }else { String path1 = i.getAbsolutePath(); list(path1); } } } /** *列出所有文件 */ public static void filter (String path){ IOTest ioTest = new IOTest(); File file = new File(path); if(!file.isDirectory()&&!file.isFile()) { System.out.println("您输入的不是一个正确的路径"); return; }else if(file.isFile()){ System.out.println("您输入的是一个文件路径,文件地址"+file); }else if(file.isDirectory()){ System.out.println("您输入的是一个目录路径,该目录下的所有文件地址如下"); ioTest.list(path); } }查看全部
-
一定要注意了 要尽心序列化的对象的类 必须实现Serializable借口 就应当向下面这样 class Student implements Serializable { } 其实序列化,就是把一个对象的各个属性,写入到文件中,写入文件中,就是以字节的形式存储。 String file = "demo/obj.dat"; //相对路径下可以使用单鞋干 /* ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(file)); Student stu = new Student("10001", "张三", 20); oos.writeObject(stu); oos.flush(); oos.close();*/ //通过反序列化 把序列化后的对象读出 ObjectInputStream ois = new ObjectInputStream( new FileInputStream(file)); Student stu = (Student) ois.readObject(); System.out.println(stu); ois.close();查看全部
-
3、对象的序列化的放序列化查看全部
-
字符流 之字符流的过滤器 除了具有基本的读写单个字外,更具有加强功能,可以一次性的读写一行。可以参见帮助文档,文档中的介绍更加详细,介绍到字符流的顾虑器,优化了一般的Reader的巨大开销。<br> Bufferedreader-->readLine()<br> BufferedWriter/PrintWriter 可以实现一次写一行 /**其构造需要双层的嵌套 * 看看下面是一个多么恶心的嵌套,FileReader 是对一个 Reader 进行过滤 所以,构造式需要传进来一个Reader,(我们知道Reader是一个抽象类,我们只能使用起实现子类) * 我们有知道,用的是Reader的实现子类 InputStreamReader,而InputStreamReader它有需要一个InputStream,我们最常用的 * InputStream的实现子类是FileInputStream,因为我们这里也是对文件进行操作 */ BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("e:\\Jworkspace\\code.txt"))); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("e:\\Jworkspace\\code2.txt"))); String line; while((line = br.readline())!=null) //一次读一行 { System.out.println(line); //一次读一行不支持换行, 必须使用println bw.write(line); //必须要单独写出黄航 bw.newLine(); bw.flush(); } br.close(); bw.close查看全部
-
FileReader / FileWriter 专用对文件字符流的操作,无需进行 嵌套构造 FileReader fr = new FileReader ("目录/路径"); FileWriter fw = new FileWriter ("目录 / 路径", true ); //加上true参数表示追加 虽然不需要嵌套构造,但是不能指定读取文件的编码方式,其限制是 只能读取和项目编码相同的文件。如果非要指定读取文件的编码方式,只能使用 嵌套构造的方式。查看全部
-
I/O字节流功能总结 批量最快即 byte[] buf=new byte(8*1024); int b; b=in.read(buf.0.buf.length)查看全部
-
怎么说呢 InputStreamReader的创建需要有一个InpuStream型的路径,这个再创建InputStreamReader时是可以看到eclipse的提醒,但是通常我们都是操作一些文本文件,所以从门就先创建一个 FileInputStream in = new FileInputStream("路径字符串")<br> <br> FileInputStream in = new FileInputStream("e:\\Jworkspace\\bigNum.txt");<br> InputStreamReader isr = new InputStreamReader(in ,"gbk"); //创建 Reader实例并指定编码方式 默认为 gbk 因为 现在工作空间的编码 方式就是 gbk 别忘了 类比着 学习 当然也可以使用 批量读取 的方式 char[] buffer = new char[8*1024]; int c; //批量读取,放入buffer数组,从第0个位置开始,返回的是读到的字符的个数给c whiole((c = isr.read(buffer, 0, buffer.length))!=-1) //这里就是前面的类推 { String s = new String("buffer, 0, c); //转化为一个字符串 }查看全部
-
2、字符流 1)编码问题 前已述及 起码有一点要非常清楚的是,一切进入计算机的都会变成字节码 2)认识文本和文本文件 java中的文本(其实就是char)16位的无符号整数,是字符的unicode编码(这是一种双自己编码) 文件是byte byte byte...的数据集合,可以缩句来理解 文件输数据集合。字节流的编码方式和序列化规则不一样就形成了不同的文件:文本文件,音频文件,视频文件等 文本文件是文本(char的编码)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的数据存储集合 (3)字符流 抽象类 Reader Writer 二者实现了数据的两种相互转换,存储时我们用字节码的形式存储,读入计算机内存处理(包括显示,运算等)是用字符(ABC...)的形式。 字符的处理,一次处理一个字符。其底层仍然是基本的字节序列 字符流的基本实现 InputStreamReader 完成byte流解析为char流,按照编码接卸 OutputStreamWriter 提供char流到byte流,按照编码处理。 为什么上面特别说明了一下文本文件,因为字符流大部分操作的都是文本文件。毕竟文本文编,以编码的方式不容易认读,我们才把字符编码解析为字符。如果Reader一个MP3之类的音频文件,根本就没有什么意义,因为,声音本来就不是用来看的,所以说字符流主要是用于处理文本文件的查看全部
-
一切的数据在计算机的存储中都是,数字,都是字节码,原始的是二进制的,当然你可以读出来十六进制的查看全部
举报
0/150
提交
取消