java中IO流的学

java IO流涉及到的class 和 interface.

字节流和字符流的区别:

字节流:字节流是一个字节一个字节读取,和一个字节写入,使用于传输任何类型的数据。

字符流:基于字节流,每次需要查询编码表,返回对应的字符,使用于传输字符数据。

一般情况,如果传输的是纯文本数据,建议使用字符流,其他的用字节流。

这些图是我从网上下的,我想对学习java的IO会很有帮助。有什么指点的,还请高手指点。

 

java IO流 class structure picture.

 

InputStream与OutputStream对应图

 

Reader与Writer对应图

 

代码部分:(有点儿多,技术不精,还请高手指点)

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileInputStream;
05import java.io.FileNotFoundException;
06import java.io.InputStream;
07 
08/**
09 * InputStream及其子类的用法。
10 * @author wangbiao
11 *
12 * 2013-4-27上午12:25:56
13 */
14public class Test_InputStream {
15 
16     
17    public static void test_read_first(File file) throws Exception{
18        InputStream in=new FileInputStream(file);
19        byte[] b=new byte[(int) file.length()];
20        in.read(b);
21        in.close();
22        System.out.println(new String(b));
23    }
24    public static void test_read_second(File file) throws Exception{
25        InputStream in=new FileInputStream(file);
26        byte[] b=new byte[(int) file.length()];
27        int len=in.read(b);
28        in.close();
29        System.out.println(new String(b,0,len));
30    }
31    //如果不知道數組的大小,則通過判斷是否讀到文件的末尾。
32    public static void test_read_third(File file) throws Exception{
33        InputStream in=new FileInputStream(file);
34         
35        byte[] b=new byte[1024];//file被封装起来,不能调用file.length().
36        int temp=0;
37        int len=0;
38        while((temp=in.read())!=-1){
39            b[len]=(byte) temp;
40            len++;
41        }
42        in.close();
43        System.out.println(new String(b,0,len));
44    }
45     
46     
47    public static void main(String[] args) throws Exception {
48        File file=new File("D:"+File.separator+"test.txt");
49        //test_read_first(file);
50        //test_read_second(file);
51        test_read_third(file);
52    }
53     
54}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileNotFoundException;
05import java.io.FileOutputStream;
06import java.io.OutputStream;
07 
08 
09/**
10 *
11 * OutputStream以及其常用子类的用法。
12 * @author wangbiao
13 * 2013-4-26下午11:58:14
14 */
15public class Test_OutputStream {
16 
17 
18    //将一个字节数组直接写入File里面。
19    public static void test_write_first(File file) throws Exception{
20        OutputStream out=new FileOutputStream(file,true);//true表示可以追加内容,而不是覆盖原内容。
21        String str="test java io";
22        byte[] b=str.getBytes();
23        out.write(b);
24        out.close();
25    }
26    //将一个字节数组里面的内容一个字节一个字节的写入File里面。
27    public static void test_write_second(File file) throws Exception{
28        OutputStream out=new FileOutputStream(file,true);//true表示可以追加内容,而不是覆盖原内容。
29        //String str="test java io";
30        String str="\r\n test java io";//"\r\n"代表换行
31        byte[] b=str.getBytes();
32        for (int i = 0; i < b.length; i++) {
33            out.write(b[i]);
34        }
35        out.close();
36    }
37     
38    public static void main(String[] args) throws Exception {
39        File file=new File("D:"+File.separator+"test.txt");
40        //file.delete();
41        //test_write_first(file);
42        test_write_second(file);
43    }
44}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileNotFoundException;
05import java.io.FileReader;
06import java.io.Reader;
07 
08 
09 
10/**
11 * Reader及其子类的学习
12 * @author wangbiao
13 *
14 * 2013-4-27上午12:47:46
15 */
16public class Test_Reader {
17 
18     
19    public static void test_read_first(File file) throws Exception{
20        Reader in=new FileReader(file);
21        //注意这里是char[],而不是byte[]
22        char[] c=new char[1024];
23        int len=in.read(c);
24        in.close();
25        System.out.println(new String(c,0,len));
26    }
27     
28    public static void test_read_second(File file) throws Exception{
29        Reader in=new FileReader(file);
30        //注意这里是char[],而不是byte[]
31        char[] c=new char[(int) file.length()];
32        int len=in.read(c);
33        in.close();
34        System.out.println(new String(c));
35    }
36     
37    public static void test_read_third(File file) throws Exception{
38        Reader in=new FileReader(file);
39        //注意这里是char[],而不是byte[]
40        char[] c=new char[1024];
41        int len=0;
42        int temp=0;
43        while((temp=in.read())!=-1){
44            c[len]=(char) temp;
45            len++;
46        }
47        in.close();
48        System.out.println(new String(c,0,len));
49    }
50     
51    public static void main(String[] args) throws Exception{
52        File file=new File("D:"+File.separator+"test.txt");
53        test_read_first(file);
54        test_read_second(file);
55        test_read_third(file);
56    }
57}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileWriter;
05import java.io.IOException;
06import java.io.Writer;
07 
08 
09/**
10 * Writer及其子类的学习
11 * @author wangbiao
12 *
13 * 2013-4-27上午12:40:55
14 */
15public class Test_Writer {
16 
17    public static void test_write_first(File file) throws Exception{
18        Writer out=new FileWriter(file);
19        String str="\r\n love java";
20        out.write(str);
21        out.close();
22     
23    }
24    //append content
25    public static void test_write_second(File file) throws Exception{
26        Writer out=new FileWriter(file,true);
27        String str="\r\n love java";
28        out.write(str);
29        out.close();
30     
31    }
32     
33    public static void main(String[] args) throws Exception {
34        File file=new File("D:"+File.separator+"test.txt");
35        test_write_first(file);
36        test_write_second(file);
37    }
38     
39}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileNotFoundException;
05import java.io.FileOutputStream;
06import java.io.FileWriter;
07import java.io.OutputStream;
08import java.io.Writer;
09 
10 
11 
12/**
13 *
14 * 比较字节流和字符流的区别
15 * @author wangbiao
16 *
17 * 2013-4-27上午1:01:31
18 */
19public class Compare_OutputStream_Writer {
20 
21    //可以这么理解,字符流的底层是字节流,底层数据的传输都是通过字节流来实现的。字节流可以传输图片,音乐等,而字符流则只能传输与字符有关的内容。
22    //字节流不需要缓冲区,是直接操作文件,而字符流则需要缓冲区,
23    //例如将内容写入到文件中,字节流是直接写入,字符流,是先把内容写入缓冲区中,然后通过字符流的flush(),和close()方法去触发,将缓冲区的内容传输到文件中。
24     
25     
26    //不需要缓冲区
27    public static void test_outputStream(File file) throws Exception{
28        OutputStream out=new FileOutputStream(file);
29        String str="xxxxxxxxxxxx";
30        byte[] b=str.getBytes();
31        out.write(b);
32        //out.close();不关闭输出流
33    }
34    //需要缓冲区
35    public static void test_writer(File file)throws Exception{
36        Writer out=new FileWriter(file,true);
37        String str="\r\nxxxxxxxxxx";
38        out.write(str);
39        //out.flush()和out.close()都可以触发将缓冲区的内容传输到文件中。
40        out.flush();
41        //out.close();
42         
43    }
44     
45    public static void main(String[] args) throws Exception{
46        File file=new File("D:"+File.separator+"test.txt");
47        test_outputStream(file);
48        test_writer(file);
49    }
50     
51}

 

01package com.wangbiao.test;
02 
03import java.io.ByteArrayInputStream;
04import java.io.ByteArrayOutputStream;
05import java.io.File;
06import java.io.IOException;
07import java.io.InputStream;
08import java.io.OutputStream;
09 
10 
11/**
12 *
13 * 内存操作流ByteArrayInputStream and ByteArrayOutputStream.
14 * @author WangBiao
15 *2013-4-27上午09:21:30
16 */
17public class Test_ByteArray {
18     
19     
20    public static void test(File file) throws Exception{
21        String str="work hard";
22        byte[] b=str.getBytes();
23         
24        //ByteArrayInputStream(byte[] buf, int offset, int length)
25        //ByteArrayInputStream(byte[] buf)
26 
27        InputStream in=new ByteArrayInputStream(b);
28        OutputStream out=new ByteArrayOutputStream();
29        int temp=0;
30        while ((temp=in.read())!=-1) {
31//          System.out.println(temp);//temp是字符的ASCII值
32//          out.write(temp);
33            char c=(char) temp;
34            //转换字符大小写
35            out.write(Character.toUpperCase(c));
36        }
37         
38        String string=out.toString();
39        out.close();
40        in.close();
41        System.out.println(string);
42    }
43     
44     
45    public static void main(String[] args)throws Exception{
46        File file=new File("D:"+File.separator+"test.txt");
47        test(file);
48    }
49 
50}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileInputStream;
05import java.io.FileOutputStream;
06import java.io.FileWriter;
07import java.io.InputStream;
08import java.io.InputStreamReader;
09import java.io.OutputStreamWriter;
10import java.io.Reader;
11import java.io.Writer;
12 
13 
14/**
15 * 转换流InputStreamReader and OutputStreamWriter,都是将字节流装换成字符流
16 * @author WangBiao
17 *2013-4-27上午08:49:09
18 */
19public class Test_InputSteamReader {
20 
21    //InputStreamReader
22    public static void test_inputStreamReader(File file) throws Exception{
23        InputStream in=new FileInputStream(file);
24        Reader rd=new InputStreamReader(in);
25        char[] c=new char[(int) file.length()];
26        rd.read(c);
27        rd.close();
28        System.out.println(new String(c));
29         
30    }
31    //OutputStreamWriter
32    public static void test_outputStreamWriter(File file) throws Exception{
33         
34        String str="test";
35        Writer out=new OutputStreamWriter(new FileOutputStream(file));
36        out.write(str);
37        out.close();
38    }
39     
40    public static void main(String[] args) throws Exception {
41        File file=new File("D:"+File.separator+"test"+File.separator+"test.txt");
42        file.setWritable(true);
43        test_inputStreamReader(file);
44        test_outputStreamWriter(file);
45    }
46}

 

01package com.wangbiao.test;
02 
03import java.io.IOException;
04import java.io.PipedInputStream;
05import java.io.PipedOutputStream;
06 
07 
08/**
09 *
10 * PipedInputStream and PipedOutputStream,用于不同线程之间流的数据传输
11 * @author WangBiao
12 *2013-4-27上午10:24:51
13 */
14public class Test_Piped {
15 
16    public static void main(String[] args) throws Exception {
17        PipedOutputStream_Class send=new PipedOutputStream_Class();
18        PipedInputStream_Class receive=new PipedInputStream_Class();
19        //连接两个线程管道流。
20        send.getOutput().connect(receive.getInput());
21         
22        new Thread(send).start();
23        new Thread(receive).start();
24    }
25     
26     
27}
28class PipedInputStream_Class implements Runnable{
29    private PipedInputStream input=null;
30    public PipedInputStream_Class() {
31        this.input=new PipedInputStream();
32    }
33     
34    @Override
35    public void run() {
36         
37        byte[] b=new byte[1024];
38        int temp=0;
39        int len=0;
40        try {
41            while((temp=input.read())!=-1){
42                b[len]=(byte) temp;
43                len++;
44            }
45            input.close();
46        } catch (IOException e) {
47            e.printStackTrace();
48        }
49        System.out.println(new String(b,0,len));
50    }
51 
52    public PipedInputStream getInput() {
53        return input;
54    }
55 
56}
57 
58 class PipedOutputStream_Class implements Runnable{
59    private PipedOutputStream output=null;
60    public PipedOutputStream_Class() {
61        this.output=new PipedOutputStream();
62    }
63     
64    @Override
65    public void run() {
66        String str="test";
67        try {
68            output.write(str.getBytes());
69            output.close();
70        } catch (IOException e) {
71            e.printStackTrace();
72        }
73         
74    }
75 
76    public PipedOutputStream getOutput() {
77        return output;
78    }
79 
80}

 

001package com.wangbiao.test;
002 
003import java.io.File;
004import java.io.FileInputStream;
005import java.io.FileNotFoundException;
006import java.io.FileOutputStream;
007import java.io.InputStream;
008import java.io.PrintStream;
009 
010/**
011 *
012 * PrintStream
013 *
014 * @author WangBiao 2013-4-27上午10:44:34
015 */
016public class Test_PrintStream {
017//  PrintStream(File file)
018//    创建具有指定文件且不带自动行刷新的新打印流。
019//  PrintStream(File file, String csn)
020//    创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
021//  PrintStream(OutputStream out)
022//    创建新的打印流。
023//  PrintStream(OutputStream out, boolean autoFlush)
024//    创建新的打印流。
025//  PrintStream(OutputStream out, boolean autoFlush, String encoding)
026//    创建新的打印流。
027//  PrintStream(String fileName)
028//    创建具有指定文件名称且不带自动行刷新的新打印流。
029//  PrintStream(String fileName, String csn)
030//    创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
031 
032    public static void test_printStream(File file) throws Exception{
033        PrintStream ps=new PrintStream(new FileOutputStream(file));
034        //虽然没有System.setOut(ps),但还是重定向了,内容输出到了指定的文件
035        ps.print("ddddddddd");
036        ps.println("ccccccccccc");
037        ps.close();
038         
039    }
040     
041    //有点儿C语言的意思
042    public static void test_format(File file) throws Exception{
043        PrintStream ps=new PrintStream(file);
044        String name="zhangsan";
045        int age=22;
046        float score=(float) 97.5;
047        char sex='M';
048        ps.printf("姓名为:%s;年龄为:%d;分数为:%f;性别为:%c ", name,age,score,sex);
049        ps.close();
050    }
051     
052 
053    public static void test_sys_in() throws Exception {
054        InputStream in=System.in;
055        //若字节数组的大小为奇数,并且数组大小偏小,则输入中文的时候,会出现乱码的情况,原因是一个中文占两个字节,字节数组没有完整的将中文字符装入。
056        //byte[] b=new byte[5];
057        byte[] b=new byte[1024];
058        System.out.print("请输入内容:");
059        //in.read(b);
060        StringBuffer sb=new StringBuffer();
061        int temp=0;
062        //中文是乱码,原因是中文占两个字节,不能拆开读取。
063        while((temp=in.read())!=-1){
064            char c=(char) temp;
065            if('\n'==c){
066                break;
067            }
068            sb.append(c);
069        }
070        System.out.println(sb.toString());
071        in.close();
072    }
073 
074    public static void test_sys_out() {
075        //System.out.print()
076    }
077 
078    public static void test_sys_err() {
079        //System.err.print()
080    }
081 
082    //System.in重定向
083    public static void test_sys_in_redirect(File file) throws Exception {
084        System.setIn(new FileInputStream(file));
085        InputStream input=System.in;
086        byte[] b=new byte[1024];
087        input.read(b);
088        System.out.println(new String(b));
089        input.close();
090    }
091    //System.out重定向
092    public static void test_sys_out_redirect(File file) throws Exception {
093        PrintStream ps=new PrintStream(file);
094        System.setOut(ps);
095        System.out.println("love java");
096        ps.close();
097    }
098     
099    //System.err重定向
100    public static void test_sys_err_redirect(File file) throws Exception {
101        PrintStream ps=new PrintStream(file);
102        System.setErr(ps);
103        System.err.println("love java");
104        ps.close();
105    }
106 
107    public static void main(String[] args) throws Exception {
108        File file=new File("D:"+File.separator+"test"+File.separator+"test.txt");
109        //test_printStream(file);
110        //test_format(file);
111        //test_sys_in();
112        //test_sys_in_redirect(file);
113        test_sys_out_redirect(file);
114        test_sys_err_redirect(file);
115         
116    }
117}

 

01package com.wangbiao.test;
02 
03import java.io.DataInputStream;
04import java.io.DataOutputStream;
05import java.io.File;
06import java.io.FileInputStream;
07import java.io.FileOutputStream;
08import java.io.InputStream;
09import java.io.OutputStream;
10 
11 
12/**
13 * DataInputStream and DataOutputStream,就我的理解是,这两个类不同之处是可以读取和写入基本数据类型的数据。
14 * 两者搭配起来使用,并且写入和读取的顺序要严格一样
15 * @author WangBiao
16 *2013-4-27下午03:26:37
17 */
18public class Test_DataInputStream {
19 
20    //DataInputStream(InputStream in)
21    public static void test_DataInputStream(File file) throws Exception{
22        InputStream in=new FileInputStream(file);
23        DataInputStream input=new DataInputStream(in);
24        String name=null;
25        float fl=0.0f;
26        int classNum=0;
27        char[] temp=null;
28        char c;
29        try {
30            while(true){
31                temp=new char[200];
32                int len=0;
33                while((c=input.readChar())!='\t'){
34                    temp[len]=c;
35                    len++;
36                }
37                name=new String(temp,0,len);
38                fl=input.readFloat();
39                input.readChar();
40                classNum=input.readInt();
41                input.readChar();
42                System.out.printf("姓名为:%s; 分数为: %5.2f; 班级为:%d\n",name,fl,classNum);
43            }
44        } catch (Exception e) {
45        }
46         
47        input.close();
48         
49         
50         
51         
52    }
53     
54    //DataOutputStream(OutputStream out)
55    public static void test_DataOutputStream(File file)throws Exception{
56        OutputStream out=new FileOutputStream(file);
57        DataOutputStream output=new DataOutputStream(out);
58        String[] name=new String[]{"zhangsan","lisi","wangwu"};
59        float[] score={95.5f,86.5f,100f};
60        int[] classNum={1,1,3};
61        for (int i = 0; i < name.length; i++) {
62             output.writeChars(name[i]);
63             output.writeChar('\t');
64             output.writeFloat(score[i]);
65             output.writeChar('\t');
66             output.writeInt(classNum[i]);
67             output.writeChar('\n');
68        }
69        output.close();
70    }
71    public static void main(String[] args) throws Exception{
72        File file=new File("D:"+File.separator+"test"+File.separator+"test.txt");  
73        test_DataOutputStream(file);
74        test_DataInputStream(file);
75    }
76}

 

01package com.wangbiao.test;
02 
03import java.io.File;
04import java.io.FileInputStream;
05import java.io.FileNotFoundException;
06import java.io.InputStream;
07import java.io.SequenceInputStream;
08 
09 
10/**
11 * SequenceInputStream,合并流的主要功能是将两个文件的内容合并成一个文件
12 * @author WangBiao
13 *2013-4-27下午04:08:37
14 */
15public class Test_SequenceInputStream {
16 
17    public static void test(File file1,File file2,File all) throws Exception{
18        if(!all.exists()){
19            all.createNewFile();
20        }
21        InputStream input_first=new FileInputStream(file1);
22        InputStream input_second=new FileInputStream(file2);
23        InputStream input_all=new FileInputStream(all);
24        //SequenceInputStream(InputStream s1, InputStream s2)
25        SequenceInputStream sq=new SequenceInputStream(input_first,input_second);
26        byte[] temp= new byte[1024];
27        int data=0;
28        int len=0;
29        while((data=sq.read())!=-1){
30            temp[len]=(byte) data;
31            len++;
32        }
33        System.out.println(new String(temp,0,len));
34         
35    }
36     
37    public static void main(String[] args)throws Exception{
38        File file1=new File("D:"+File.separator+"test"+File.separator+"test.txt");
39        File file2=new File("D:"+File.separator+"test"+File.separator+"good.txt");
40        File all=new File("D:"+File.separator+"test"+File.separator+"all.txt");
41        test(file1,file2,all);
42    }
43}

 

 

001package com.wangbiao.test;
002 
003import java.io.File;
004import java.io.FileInputStream;
005import java.io.FileOutputStream;
006import java.io.InputStream;
007import java.io.OutputStream;
008import java.util.zip.ZipEntry;
009import java.util.zip.ZipFile;
010import java.util.zip.ZipInputStream;
011import java.util.zip.ZipOutputStream;
012 
013 
014 
015/**
016 * ZipOutputStream和ZipInputStream为压缩流,每一个压缩文件都可以称为ZipFile.
017 * @author WangBiao
018 *2013-4-27下午04:41:01
019 */
020public class Test_ZipOutputStream {
021 
022    //将文件压缩成zip包
023    public static void test_zipOutputStream(File file) throws Exception{
024        InputStream input=null;
025        File zipFile=new File("D:"+File.separator+"test"+File.separator+"test.zip");
026        ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));;
027        if(file.isDirectory()){
028            File[] files=file.listFiles();
029            for (int i = 0; i < files.length; i++) {
030                input=new FileInputStream(files[i]);
031                zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+files[i].getName()));
032                zipOut.setComment(files[i].getName());
033                int temp=0;
034                while((temp=input.read())!=-1){
035                    zipOut.write(temp);
036                }
037            }
038        }else{
039            input=new FileInputStream(file);
040            zipOut.putNextEntry(new ZipEntry(file.getName()));
041            zipOut.setComment("test zipoutputStream");
042            int temp=0;
043            while((temp=input.read())!=-1){
044                zipOut.write(temp);
045            }
046        }
047         
048        input.close();
049        zipOut.close();
050         
051    }
052    //getNextEntry();
053    //ZipInputStream(InputStream in)
054 
055    public static void test_zipInputStream()throws Exception{
056        File file=new File("D:"+File.separator+"test"+File.separator+"test.zip");
057        InputStream input=null;
058        OutputStream output=null;
059        ZipEntry entry=null;
060        File outFile=null;
061        ZipFile zipFile=new ZipFile(file);
062        ZipInputStream zipInputStream=new ZipInputStream(new FileInputStream(file));
063         
064        while((entry=zipInputStream.getNextEntry())!=null){
065            System.out.println("解压缩"+entry.getName());
066            outFile=new File("D:"+File.separator+entry.getName());
067            if(!outFile.getParentFile().exists()){
068                outFile.getParentFile().mkdir();
069            }
070            if(!outFile.exists()){
071                outFile.createNewFile();
072            }
073            input=zipFile.getInputStream(entry);
074            output=new FileOutputStream(outFile);
075            int temp=0;
076            while((temp=input.read())!=-1){
077                output.write(temp);
078            }
079        }
080        zipInputStream.close();
081        input.close();
082        output.close();
083    }
084     
085     
086    public static void test_zipFile()throws Exception{
087        File file=new File("D:"+File.separator+"test"+File.separator+"test.zip");
088        ZipFile zipFile=new ZipFile(file);
089        System.out.println(zipFile.getName());//D:\test\test.zip
090         
091    }
092    public static void main(String[] args) throws Exception{
093//      File file=new File("D:"+File.separator+"test");
094//      test_zipOutputStream(file);
095//      test_zipFile();
096        test_zipInputStream();
097    }
098     
099     
100     
101}
01package com.wangbiao.test;
02 
03import java.io.ByteArrayInputStream;
04import java.io.File;
05import java.io.FileInputStream;
06import java.io.IOException;
07import java.io.InputStream;
08import java.io.PushbackInputStream;
09 
10 
11/**
12 * PushbackInputStream and PushbackReader 为回退流,在数据读取的时候,都是按着顺序读取的,回退流就是讲读取进来的某些数据重新退回到输入流的缓冲区中。
13 * @author WangBiao
14 *2013-4-27下午06:07:45
15 */
16public class Test_PushbackInputStream {
17     
18     
19        public static void test() throws IOException{
20            InputStream input=new ByteArrayInputStream("www.oschina.net".getBytes());
21            PushbackInputStream pushbackInput=new PushbackInputStream(input);
22            int temp=0;
23            while((temp=pushbackInput.read())!=-1){
24                if(temp=='.'){
25                    pushbackInput.unread(temp);
26                    temp=pushbackInput.read();//讀出來的依舊是‘.’,因为被退回到缓冲流里面,所有再读的时候,又把它读出来了。
27                    System.out.print("濾掉"+(char)temp);
28                }else{
29                    System.out.print((char)temp);
30                }
31            }
32            input.close();
33            pushbackInput.close();
34        }
35     
36     
37      public static void main(String[] args) throws IOException{
38          test();
39}
40}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值