文件的输入与输出(一)

 1.StringBuild &&StringBuffer


StringBuilder
append \delete\insert\repace\reverse等方法.


StringBuffer
toString   capacity    length    setLength   charAt等方法
substring(INT)返回从startindex开始的子串
substring(int,int)返回从startindex到endindex的子串
http://developer.android.com/intl/zh-cn/reference/java/lang/StringBuffer.html

构造器:
StringBuffer()
Constructs a new StringBuffer using the default capacity which is 16.//构建一个容量为16的空的字符串生成器
StringBuffer(int capacity)
Constructs a new StringBuffer using the specified capacity.//指定容量的构造器

StringBuffer( String string)
Constructs a new StringBuffer containing the characters in the specified string.//带指定字符串的字符串生成器
StringBuffer( CharSequence cs)
Constructs a StringBuffer and initializes(初始化) it with the content from the specified  CharSequence.


构造


/*******************************************以下摘自博文http://blog.csdn.net/rmn190/article/details/1492013
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,
譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
**********************************************************************/


2.PrintW rite类
/*****************************************************************摘自博文http://blog.csdn.net/zsw2zkl/article/details/7209734

java.io包

1)首先先知道它的八种构造方法,但怎么记住这八种呢?我们都知道PrintWriter是一种过滤流,也叫处理流。也就是能对字节流和字符流进行处理,所以它会有:

PrintWriter(OutputStream out)  根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。

PrintWriter(Writer out)  创建不带自动行刷新的新 PrintWriter。


  这两种构造方法。由于PrintWriter能够实现自动刷新所以又衍生出另两种:

PrintWriter(OutputStream out, boolean autoFlush)  通过现有的 OutputStream 创建新的 PrintWriter。

PrintWriter(Writer out, boolean autoFlush)  创建新 PrintWriter


  true代表能自动刷新。注意这四种均不能指定编码集,但PrintStream中对OutprintStream操作时是可以的。【其中原因我不知,有知道的朋友欢迎指教】。

  然后PrintWriter能够直接对文件操作,所以还有这两种构造方法:

PrintWriter(File file) 使用指定文件创建不具有自动行刷新的新 PrintWriter。

PrintWriter(String fileName)  创建具有指定文件名称且不带自动行刷新的新 PrintWriter。


  注意该构造方法无法指定能否自动刷新,但可以指定字符集所以又衍生出两种:

PrintWriter(File file, String csn)  创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。

PrintWriter(String fileName, String csn)  创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。


2)熟记这八种构造方法,你可以随心构造你需要的PrintWriter对象了(假如为pw)。那它实现了什么接口呢?

1.Closeable接口, 所以它有pw.close()方法来实现对PrintWriter的关闭。

2.Flushable接口,所以它有pw.flush()方法来实现人为的刷新。

3.Appendable接口,所以它有pw.append(char c)方法来向此输出流中追加指定字符,等价于print().

3)下面就是它的方法。

返回类型为PrintWriter的方法

append(char c)

format(String regex,Object args)以指定格式的字符串和参数写入PrintWriter,我个人认为等同于printf

printf()

返回类型为void的方法

println(Object obj)打印obj,可以是基本数据类型或对象,并换行

print(Object obj)同上,但不换行

write(int i) 写入单个字符i

write(char[] buf)  写入字符数组。

write(char[] buf, int off, int len)  写入字符数组的某一部分。

write(String s) 写入字符串 

write(String s, int off, int len)写入字符串的某一部分

个人认为:write()方法与print()方法基本一致 但是write(char[] buf, int off, int len)print()不行。但笔者推荐使用Print系列方法,这正是PrintWriter类的价值所在。

返回类型为boolean类型的方法

checkError() 刷新流并检查其错误状态

4)举例:

import java.io.IOException;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.File;
public class PrintWriterDemo {
public static void main(String[] args) {
PrintWriter pw = null;
String name = "张松伟";
int age = 22;
float score = 32.5f;
char sex = '男';
try{
pw = new PrintWriter(new FileWriter(new File("e:\\file.txt")),true);
pw.printf("姓名:%s;年龄:%d;性别:%c;分数:%5.2f;", name,age,sex,score);
pw.println();
pw.println("多多指教");
pw.write(name.toCharArray());
}catch(IOException e){
e.printStackTrace();
}finally{
pw.close();
}
}
}

上面这个例子中呢,完全可以把pw = new PrintWriter(new FileWriter(new File("e:\\file.txt")),true);中的new  FileWrite去掉 毫无影响且可以指定字符集。


********************************************************************/


3.Scanner


java.util包

1)首先记住它的8中构造方法同PrintWriter类Scanner类同样可以直接对文件进行操作

Scanner(File source)  构造一个新的 Scanner,它生成的值是从指定文件扫描的,底层平台的默认字符集转换成字符。 

Scanner(File source, String csn)指定字符集  。

  但如果用String的话是不能指定字符集的

Scanner(String source) 构造一个新的 Scanner,它生成的值是从指定字符串扫描的,Scanner的这个构造方法允许它能作为扫描器。 

  注意同PrintWriter的区别,若想指定字符集就必须将目录或文件转换成File对象。不同于PrintWriter()的还有当以流作为输入对象时,他是可以指定字符集的

Scanner(InputStream source) 构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。 

Scanner(InputStream source, String charsetName) 构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。

 还有Scanner能够将实现Readable,ReadableByteChannel接口的类作为参数

Scanner(Readable source)  构造一个新的 Scanner,它生成的值是从指定源扫描的。 

Scanner(ReadableByteChannel source) 构造一个新的 Scanner,它生成的值是从指定信道扫描的。 

Scanner(ReadableByteChannel source, String csn) 构造一个新的 Scanner,它生成的值是从指定信道扫描的。

2)Scanner类实现了Iterator接口

所以它有boolean hasNext()方法

Object next()方法

void remove()方法

3)常用方法

1.useDelimiter()【useDelimiter使用定界符的意思】将Scanner类的分隔模式设置为指定模式,这个方法让Scanner对象成为了扫描器(参见API)

例如:

String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 

输出为:

     1
     2
     red
     blue 
补充:

\s——代表任何空白字符

\S——代表任何非空白字符

以下代码使用正则表达式同时解析所有的 4 个标记,并可以产生与上例相同的输出结果:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++)
         System.out.println(result.group(i));
     s.close();
补充:

\d——代表任何数字字符,即[0-9]

\D——代表任何非数字字符

\w——代表任何单字字符(字母a~z、A~Z、下划线、0~9),即[a-zA-Z_0-9]

\W——代表任何非单字字符

下面的例子帮助你记住该段

import java.util.regex.Pattern; import java.util.regex.Matcher; public class RegexTest3 { public static void main(String[] args) {

String str ="We call this the live-code approach.These examples are available from three locations-they are "             +"on the CD that accompanies this book"; String  regex = "[a-zA-Z]+";  //根据单词的特性准备一个正则表达式。 Pattern  pObj = Pattern.compile(regex); //1 匹配模式对象。 Matcher  mObj = pObj.matcher( str ); //2 将正则表达式转换成一个匹配器 System.out.println("你给定的字符串如下: \n\"" + str + "\"");

System.out.println("\n以上字符串中包含的单词分别如下:");

int counter = 0;

while( mObj.find()) {//3 查找 String word = mObj.group();//4 获取 counter++;//计数 System.out.println("第" + counter + "单词是: " + word ); //处理(显示) }

} }

2.下面的方法和DataInputStream中的方法readXxx()类似

    nextXxx()从流中读取一个Xxx并返回Xxx值。具体详见API








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值