`
精神分裂
  • 浏览: 29336 次
  • 性别: Icon_minigender_1
  • 来自: 二次元世界
社区版块
存档分类
最新评论

对Java IO的一些总结 (3)

    博客分类:
  • Java
阅读更多
注:文中使用部分方法请参考《对Java IO的一些总结 (1) 》《对Java IO的一些总结 (2) 》

读文件的关键技术点如下:
1. 用FileInputStream打开文件输入流,通过read方法以字节为单位读取文件,是最通用的读文件的方法,能读取任何文件,特别适合读二进制文件,如图片、声音、视频文件。
2. 用InputStreamReader打开文件输入流,通过read方法以字符为单位读取文件,常用于读取文本文件
3. 用BufferedReader打开文件输入流,通过readLine方法以行为单位读取文件,重用于读格式化的文本。
4. 用RandomAccessFile打开文件输入流,通过seek方法将读指针移到文件内容中间,
   再通过read方法读取指针后文件内容,常用于随机的读取文件。
注意:文件读取结束后,关闭流。
/**
	 * 以字节为单位读取文件(一次读一个字节)
	 * 常用于读取二进制文件。如图片,声音,影像等文件
	 * @param filePath 文件名
	 */
	public static String readFileByBytesInOneByOne(String filePath) {
		File file = new File(filePath);
		InputStream in = null;
		StringBuffer sub = new StringBuffer();
		try {
			in = new FileInputStream(file); //一次读一个字节
			int tempbyte;
			while ((tempbyte = in.read()) != -1) {
				sub.append((char)tempbyte);
			}
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException el) {
					el.printStackTrace();
				}
			}
		}
		return sub.toString();
	}
	
	/**
	 * 以字节为单位读取文件(一次读多个字节)
	 * 常用于读取二进制文件。如图片,声音,影像等文件
	 * @param filePath 文件名
	 */
	public static void readFileByBytes(String filePath) {
		File file = new File(filePath);
		InputStream in = null;
		StringBuffer sub = new StringBuffer();
		try {
			byte[] tempbytes = new byte[1024];
			int byteread = 0;
			in = new FileInputStream(file);
			showAvailableBytes(in);
			while ((byteread = in.read(tempbytes)) != -1) {
				System.out.write(tempbytes, 0, byteread);
			}
		} catch (Exception el) {
			el.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException el) {
					el.printStackTrace();
				}
			}
		}
		System.out.println(sub.toString());
	}


	/**
	 * 以字符为单位读取文件,常用于读文本、数字等类型的文件(一次读一个字符)
	 * @param filepath 文件名
	 */
	public static String readFileByCharsInOneByOne(String filepath) {
		File file = new File(filepath);
		Reader reader = null;
		StringBuffer sub = new StringBuffer();
		try {
			reader = new InputStreamReader(new FileInputStream(file));
			int tempchar;
			while ((tempchar = reader.read()) != -1) {
				/* 在windows下,这两个字符在一起时,表示一个换行,但如果这两个字符分开显示时
				 * 会换两次行,因此,屏蔽掉 ,或者;否则,将会多出很多空行 */
				if (((char) tempchar) != ' ') {
					sub.append((char) tempchar);
				}
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return sub.toString();
	}
	
	/**
	 * 以字符为单位读取文件,常用于读文本、数字等类型的文件(一次读多个字符)
	 * @param filepath 文件名
	 */
	public static void readFileByChars(String filepath) {
		File file = new File(filepath);
		Reader reader = null;
		try {
			char[] tempchars = new char[100];
			int charread = 0;
			reader = new InputStreamReader(new FileInputStream(file));
			while ((charread = reader.read(tempchars)) != -1) {
				if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != ' ')) {
					System.out.print(tempchars);
				} else {
					for (int i = 0; i < charread; i++) {
						if (tempchars[i] == ' ') {
							continue;
						} else {
							System.out.print(tempchars[i]);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 以行为单位读取文件,常用于读取面向行的格式化文件
	 * @param fileName 文件名
	 */
	public static String readFileByLines(String fileName) {
		File file = new File(fileName);
		BufferedReader reader = null;
		StringBuffer sub = new StringBuffer();
		try {
			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
//			int line = 1;
			while ((tempString = reader.readLine()) != null) {
//				System.out.println("line:" + line + ": " + tempString); //显示行号
//				line++;
				sub.append(tempString+"\n");
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return sub.toString();
	}


用java写文件有多种方法,对于不同类型的数据,有不同的写入方法,写文件的关键技术点如下:
1. FileOutputStream打开文件输出流,通过write方法以字节为单位写入文件,是写文件最通用的方法,能写入任何类型的文件,特别适合写二进制数据文件。
2. OutputStreamWriter打开文件输出流,通过write方法以字符为单位写入文件,能够将字符数组和字符串写入文件。
3. PrintWriter打开文件输出流,通过print和println方法写字符串到文件,与System.out的用法相似,常用于写入格式化的文本。
注意:当文件写完后关闭输出流。
	/**
	 * 以字节为单位写文件。适合于写二进制文件,如图片等
	 * @param filePath 文件名
	 */
    public static void writeFileByBytes(String filePath, String content) {
        File file = new File(filePath);
        OutputStream out = null;
        try {
            out = new FileOutputStream(file);
            byte[] bytes = content.getBytes(); //读取输出流中的字节
            out.write(bytes);
            System.out.println("Write \"" + file.getAbsolutePath() + "\" success");
        } catch (IOException e) {
        	System.out.println("Write \"" + file.getAbsolutePath() + "\" fail");
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch(IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
    
    /**
     * 以字符为单位写文件
     * @param fileName 文件名
     */
    public static void writeFileByChars(String fileName, String content) {
        File file = new File(fileName);
        Writer writer = null;
        try {
            //打开文件输出流
        	//OutputStreamWriter是字符流通向字节流的桥梁:使用指定的charset将要向其写入的字符编码为字节
            writer = new OutputStreamWriter(new FileOutputStream(file));
            writer.write(content);
            System.out.println("Write \"" + file.getAbsolutePath() + "\" success.");
        } catch (IOException e) {
            System.out.println("Write \"" + file.getAbsolutePath() + "\" fail.");
            e.printStackTrace();
        } finally {
            if(writer != null) {
                try{
                    writer.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
    
    /**
     * 以行为单位写文件
     * @param fileName 文件名
     */
    public static void writeFileByLines(String fileName, String content) {
        File file = new File(fileName);
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileOutputStream(file));
            writer.println(content); //写字符串
            //写入各种基本类型数据
            writer.print(true);
            writer.print(155);
            writer.println(); //换行
            writer.flush(); //写入文件
            System.out.println("Write \"" + file.getAbsolutePath() + "\" success.");
        } catch (IOException e) {
        	System.out.println("Write \"" + file.getAbsolutePath() + "\" fail.");
            e.printStackTrace();
        } finally {
            if (writer != null) {
                writer.close();    //关闭输出文件流
            }
        }
    }


向文件尾追加内容有多种方法,下面介绍两种常用的方法。具体如下:
1. 通过RandomAccessFile以读写的方式打开文件输出流,使用它的seek方法可以将读写指针移到文件尾,再使用它的write方法将数据写道读写指针后面,完成文件追加。
2. 通过FileWriter打开文件输出流,构造FileWriter时指定写入模式,是一个布尔值,为true时表示写入的内容添加到已有文件内容的后面,为false时重新写文件,以前的数据被清空,默认为false。
    /**
	 * A方法追加文件。使用RandomAccessFile
	 * @param fileName 文件名
	 * @param content 追加的内容
	 */
	public static void appendFileContent_I(String fileName, String content) {
		try {
			//按读写方式打开一个随机访问文件流
			RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
			long fileLength = randomFile.length(); //文件长度,字节数
			randomFile.seek(fileLength); //将写文件指针移到文件尾
//			randomFile.writeBytes(content); //中文产生乱码
			randomFile.write(content.getBytes()); //中文不产生乱码
			randomFile.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * B方法追加文件。使用FileWriter
	 * @param fileName 文件名
	 * @param content 追加的内容
	 */
	public static void appendFileContent_II(String fileName, String content) {
		try {
			//打开一个写文件器,构造函数的第二个参数true表示以追加的形式写文件
			FileWriter writer = new FileWriter(fileName, true);
			writer.write(content);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
分享到:
评论

相关推荐

    Java io流总结

    Java io流的总结

    Java_IO完全总结

    Java IO系统主要包括两个包:`java.io`和`java.nio`(New IO),其中`java.io`提供了一系列基于流的I/O操作接口与实现类,而`java.nio`则提供了更高效的数据访问方式,如通道和缓冲区等。 Java IO系统的设计原则之...

    JavaIO总结

    有关Java输入输出流的总结有关Java输入输出流的总结有关Java输入输出流的总结

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    Java IO流 总结

    Java IO流总结 Java IO流是Java语言中最基本和最重要的输入/输出机制,负责将数据从外部世界输入到Java应用程序中或将数据从Java应用程序输出到外部世界。IO流可以分为两大类:字节流和字符流。 1. 节点流:离数据...

    JavaIO流详细总结

    下面是对Java IO流的详细总结: 1. 流的概念: 流是一种抽象的数据传输方式,可以将数据从一个地方传输到另一个地方。Java中的流分为输入流和输出流,分别用于读取和写入数据。流按照处理数据的不同类型,又可以...

    Java IO流总结

    除了基本的读写操作,Java IO流还支持缓冲流,如BufferedInputStream和BufferedReader,它们可以提高读写效率,减少对底层资源的频繁调用。此外,还有过滤流,如DataInputStream和PrintStream,它们提供了额外的功能...

    JAVA的IO流总结

    java的IO流总结:包含Inputstream,OutputStream,writer和reader

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

    java_IO完全总结

    Java IO完全总结的知识点: 一、历史背景: 1. IO系统设计的困难性:对于编程语言设计人员来说,设计一个功能完善的输入输出系统是非常有挑战性的。需要考虑各种不同的因素,如文件、控制台、网络、内存等的读取方式...

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    java IO.chm

    这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、文件操作、对象序列化以及NIO(非阻塞IO)等多个方面进行展开。 一、Java IO体系结构 Java IO体系是Java平台中用于处理数据输入...

    JAVAIO操作总结

    本文将对Java IO中的节点流和处理流进行详细的总结。 首先,我们来看一下Java IO的基础——节点流。节点流直接与数据源或数据接收器相连,它们直接处理数据源(如文件、数组或字符串)。Java中的基本节点流分为两大...

    java io惯用总结

    JAVA IO惯用总结_编程大全_优良自学吧

    javaIO流知识大总结

    在这个大总结中,我们将深入探讨Java IO流的基本概念、分类、常用类以及实践应用。 1. **基本概念** - **流(Stream)**:在Java中,流是一个抽象的概念,代表数据的有序序列。它可以是字节流或字符流,流向可以是...

    java IO操作总结

    ### Java IO操作总结 Java IO(输入/输出)是Java编程语言中用于处理数据输入和输出的核心机制。本文档全面总结了Java IO的各种操作,旨在为开发者提供一个深入理解并熟练掌握Java IO技术的资源。 #### 一、临时...

    java中的IO操作总结(四)

    java中的IO操作总结(四) 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23...

    “Java IO”总结

    这篇文章将对"Java IO"进行深入的总结,涵盖其核心概念、类库和实用技巧。 Java IO系统是Java平台中用于处理输入输出的重要部分,它包括一系列的类和接口,使得程序能够读取和写入各种数据流。Java IO API的设计...

    Java IO_NIO

    总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。

Global site tag (gtag.js) - Google Analytics