天道酬勤,学无止境

文件和文件夹的操作——文件流的使用

1、文件的读取和写入

思路:主要用到了File类的CreateText方法和StreamWriter类的WriteLine方法。

(1)、File类的CreateText方法,该方法实现创建或打开一个文件用于写入UTF-8编码的文本。语法如下:public static StreamWriter(string path)

(2)、StreamWriter类的WriteLine方法

该方法实现将后跟行结束符的字符串写入文件流,语法如下:

public virtual void WriteLine(string  value)

参数说明:value:要写入的字符串,如果value为null,则仅写入行结束字符。

public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)

            {

                textBox1.Text = saveFileDialog1.FileName;

            }

            else

            {

                textBox1.Text = "";

            }

        }

        private void button2_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(textBox1.Text.Trim()))//若文件路径为空

            {

                MessageBox.Show("请设置文件路径!");

                return;

            }

            if (String.IsNullOrEmpty(textBox2.Text.Trim()))//若文本内容为空

            {

                MessageBox.Show("请输入文件内容!");

                return;

            }

            if (!File.Exists(textBox1.Text))

            {//创建或打开一个文件用于写入 UTF-8 编码的文本。

                using (StreamWriter sw = File.CreateText(textBox1.Text))                {

                    sw.WriteLine(textBox2.Text);//把字符串写入文本流

                    MessageBox.Show("文件创建成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

            }

            else

            {

                MessageBox.Show("该文件已经存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

        }

    }

2、OpenRead方法打开现有文件并读取

思路:主要用到了File类的OpenRead方法和FileStream类的Read方法。

(1)、File类的OpenRead方法,该方法实现打开现有文件以进行读取,语法格式如下:

public static FileStream OpenRead(string path)

参数说明:path:要打开以进行读取的文件。

返回值:指定路径上的只读文件流。

(2)、FileStream类的Read方法

该方法实现从流中读取字节快并将该数据写入给定的缓冲区中,语法如下:

public override int Read(byte[] array,int offset,int count)

Read方法中的参数说明:

参数

说明

Array

写入数据的缓冲区

Offset

读取的开始位置索引

Count

最多读取的字节数

返回值

读入Buffer中的总字节数。如果当前的字节数没有所请求的那么多,则总字节数可能小于所请求的字节数;或者如果已到达流的末尾,则为零。

例:

private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                openFileDialog1.Filter = "文本文件(*.txt)|*.txt";//设置打开文件的类型

                openFileDialog1.ShowDialog();

                textBox1.Text = openFileDialog1.FileName;//设置打开的文件名称

                FileStream fs = File.OpenRead(textBox1.Text);//打开现有文件以进行读取

                byte[] b = new byte[1024];//定义缓存

                while (fs.Read(b, 0, b.Length) > 0)//循环每次读取1024个字节到缓存中

                {//把字节数组所有字节转为一个字符串

                    textBox2.Text = Encoding.Default.GetString(b);              

 }

            }

            catch { MessageBox.Show("请选择文件"); }

        }

3、使用OpenWrite方法打开现有文件并进行写入

思路:是要用到了File类的OpenWrite方法,Encoding抽象类的GetBytes方法和FileStream类的Write方法,

  1. File类的OpenWrite方法

该方法用于实现打开现有文件以进行写入,语法如下:

Public static FileStream OpenWrite(string path)

参数说明:path:要打开以尽心写入的文件。

返回值:返回具有写入权限的指定路径上的飞共享文件流对象。

  1. Encoding抽象类的GetBytes方法。该方法用于实现将指定的字符串中的所有字符编码为一个字节序列。语法如下:public virtual byte[] GetBytes(string s)

参数说明:s:包含要编码的字符的字符串。

返回值:返回一个字节数组,包含对指定的字符集进行编码的结果。

  1. FileStream类的Write方法。该方法实现使用从缓冲区读取的数据将字节块写入该流。语法如下:public override void Write(byte[] array,int offset,int count)

Write方法中的参数说明:

参数

说明

Array

包含要写入该流的数据的缓冲区

Offset

位置索引,从此处开始将字节复制到当前流

Count

要写入当前流的最大字节数。

返回值

无返回值

例:

  public partial class Form1 : Form {

public Form1()

{  InitializeComponent();}

        private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.Filter = "文本文件(*.txt)|*.txt";

            openFileDialog1.ShowDialog();

            textBox1.Text = openFileDialog1.FileName;

        }

        private void button2_Click(object sender, EventArgs e)

        {

          

            if (String.IsNullOrEmpty(textBox1.Text.Trim()))

            {

                MessageBox.Show("请设置文件!");

                return;

            }

            try

            {

                FileStream FStream = File.OpenWrite(textBox1.Text);

                Byte[] info = Encoding.Default.GetBytes(textBox2.Text);

                FStream.Write(info, 0, info.Length);

                FStream.Close();

                MessageBox.Show("写入文件成功!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

}

3、打开现有UTF-8编码文本文件并进行读取

思路:主要用到File类的OpenText方法和StreamReader类的ReadToEnd方法,

  1. File类的OpenText方法,该方法实现打开现有UTF-8编码文本文件以进行读取。语法如下:public static StreamReader OpenText(string path)

(2)   StreamReader类的ReadToEnd()。参数说明:返回值:返回字符串形式的流的其余部分(从当前位置到末尾)。如果当前位置位于流的末尾,则返回空字符串(””)。

例:

private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                openFileDialog1.Filter = "文本文件(*.txt)|*.txt";

                openFileDialog1.ShowDialog();

                textBox1.Text = openFileDialog1.FileName;

                StreamReader SReader = File.OpenText(textBox1.Text);

                textBox2.Text = SReader.ReadToEnd();

            }

            catch { }

        }

4、读取文件中的第一行数据

主要用到的方法:ReadLine();

openFileDialog1.Filter = "文本文件(*.txt)|*.txt";

                openFileDialog1.ShowDialog();

                textBox1.Text = openFileDialog1.FileName;

                StreamReader SReader = new StreamReader(textBox1.Text, Encoding.Default);

                textBox2.Text = SReader.ReadLine();

5、将文本文件转换成网页文件

思路:主要用到RichTextBox控件AppendText方法和SaveFile方法。

(1)、RichTextBox控件的AppendText方法,该方法实现向文本框的当前文本追加文本,格式如下:

Public void AppendText(string text)

  1. SaveFile方法,该方法实现将RichTextBox中的内容保存到特定类慈宁宫的文件中,语法如下:public void Save File(string path,RichTextBoxStreamType fileType)

FileType: RichTextBoxStreamType枚举之一,

枚举值

说明

RichText

RTF格式流

PlainText

用空格代替对象连接与嵌入(OLE)对象的纯文本流

RichNoOleObjs

用空格代替OLE对象的丰富文本格式(RTF格式)流

TextTextOleObjs

具有OLE对象的文本表示形式的纯文本流

UnicodePlainText

包含空格代替对象链接与嵌入(OLE)对象的文本流

 

例:

  string strContent = "##科技有限公司是一家以计算机软件技术为核心的高科技企业,多年来始终致力于行业管理软件开发、数字化出版物制作、计算机网络系统综合应用以及行业电子商务网站开发领域,涉及生产、管理、控制、仓储、物流、营销、服务等行业。公司拥有软件开发和项目实施方面的资深专家和学习型技术团队,多年来积累了丰富的技术文档和学习资料,公司的开发团队不仅是开拓进取的技术实践者,更致力于成为技术的普及和传播者。";

                string strCompany = "##科技有限公司";

                string strWeb = "www.##soft.com";

                string strFileName = "公司网页.htm";

                richTextBox1.Clear();

                richTextBox1.AppendText("

                richTextBox1.AppendText("

                richTextBox1.AppendText("

                richTextBox1.AppendText(strCompany);

                richTextBox1.AppendText("");

                richTextBox1.AppendText("");

                richTextBox1.AppendText("

                richTextBox1.AppendText("

");

                richTextBox1.AppendText("

" + strCompany + "

");

                String strHyper = "

欢迎访问**科技公司网站:";

                richTextBox1.AppendText(strHyper + strWeb + "");

                richTextBox1.AppendText("");

                richTextBox1.AppendText(strContent);

                richTextBox1.AppendText("");

                richTextBox1.AppendText("");

                richTextBox1.SaveFile(strFileName, RichTextBoxStreamType.PlainText);

                System.Diagnostics.Process.Start(strFileName);

6、读写内存流数据

主要用到MemoryStream类的Capacity属性,Write方法和Read方法。

例:

private void button1_Click(object sender, EventArgs e)

        {

            byte[] BContent = Encoding.Default.GetBytes(textBox1.Text);

            MemoryStream MStream = new MemoryStream(100);

            MStream.Write(BContent, 0, BContent.Length);

            richTextBox1.Text = "分配给该流的字节数:" + MStream.Capacity.ToString() + "\n流长度:"

                + MStream.Length.ToString() + "\n流的当前位置:" + MStream.Position.ToString();

            MStream.Seek(0, SeekOrigin.Begin);

            byte[] byteArray = new byte[MStream.Length];

            int count = MStream.Read(byteArray, 0, (int)MStream.Length - 1);

            while (count < MStream.Length)

            {

                byteArray[count++] = Convert.ToByte(MStream.ReadByte());

            }

            char[] charArray = new char[Encoding.Default.GetCharCount(byteArray, 0, count)];

            Encoding.Default.GetChars(byteArray, 0, count, charArray, 0);

            for (int i = 0; i < charArray.Length; i++)

            {

                richTextBox2.Text += charArray[i].ToString();

            }

        }

6、创建并写入二进制文件数据

思路:主要用到BinaryWriter类的构造方法和Write方法。

例: private void button2_Click(object sender, EventArgs e)

 {

  if (String.IsNullOrEmpty(textBox1.Text.Trim()))

            {

                MessageBox.Show("请选择文件路径");

                return;

            }

            if (String.IsNullOrEmpty(textBox2.Text.Trim()))

            {

                MessageBox.Show("请设置文件名称");

                return;

            }

            try

            {

                FileStream myStream = new FileStream(textBox1.Text + "\\" + textBox2.Text+".bin", FileMode.Create);

                BinaryWriter myWriter = new BinaryWriter(myStream);

                for (int i = 0; i < 10; i++)

                {

                    myWriter.Write(i);

                }

                myWriter.Close();

                myStream.Close();

                MessageBox.Show("创建并写入成功!");

            }

            catch(Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

7、读取二进制文件的内容

例:

  private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.Filter = "*.bin|*.bin";

            openFileDialog1.ShowDialog();

            textBox1.Text = openFileDialog1.FileName;

        }

        private void button2_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(textBox1.Text.Trim()))

            {

                MessageBox.Show("请选择文件");

                return;

            }

            textBox2.Text = string.Empty;

            try

            {

                FileStream myStream = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);

                BinaryReader myReader = new BinaryReader(myStream);

                for (int i = 0; i < myStream.Length; i++)

                {

                    textBox2.Text += myReader.ReadInt32();

                }

                myReader.Close();

                myStream.Close();

            }

            catch { }

        }

8、使用缓冲流复制文件

思路:在使用缓冲流,需要用到System.IO命名空间下的BufferedStream类,BufferedStream流,也称作缓冲流,它实现给另一个流上的读写操作添加一个缓冲层。缓冲流在内存中创建一个缓冲区,它会以最有效的增量从磁盘中读取字节到缓冲区,它会以最有效率的增量从磁盘中读取字节到缓冲区。缓冲区是内存中的字节块,用于缓存数据从而减少对操作系统的调用次数,缓冲区可提高读取和写入性能。

  1. BufferedStream类的Read方法。该方法实现将字节从当前缓冲流复制数组。格式如下:public override int Read(byte[] array,int offset,int count)

参数

说明

Array

将字节复制到缓冲区

Offset

位置索引,从此处开始读取字节

Count

要读取的字节数

返回值

读入array字节数组中的总字节数。如果可用的字节没有所请求的那么多,总字节数可能小于请求的字节数;或者如果可读取任何数据前就已达到流的末尾,则为零。

  1. BufferedStream 类的Write方法。该方法实现字节复制到缓冲流,并将缓冲流内的当前位置前进写入的字节数,语法如下:public override void Write(byte[] array,int offset,int count)。Write参数说明:

参数

说明

Array

字节数组,从该字节数组count个字节复制到当前缓冲流中。

Offset

缓冲区的偏移量,从此处开始将字节复制到当前缓冲流中

Count

要写入当前缓冲流中的字节数

返回值

无返回值

  1. BufferedStream类的Flush方法。该方法实现清楚该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。语法格式:public override void Flush()

注:由于缓冲流在内存的缓冲区中直接读写数据,而不是从硬盘中直接读写数据,所以它处理大容量的文件尤为适合。

例:

   public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.Filter = "文件(*.*)|*.*";

            openFileDialog1.ShowDialog();

            textBox1.Text = openFileDialog1.FileName;

        }

        private void button2_Click(object sender, EventArgs e)

        {

            folderBrowserDialog1.ShowDialog();

            textBox2.Text = folderBrowserDialog1.SelectedPath;

        }

        private void button3_Click(object sender, EventArgs e)

        {

            try

            {

                string str1 = textBox1.Text;

                string str2 = textBox2.Text + "\\" + textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\") + 1, textBox1.Text.Length - textBox1.Text.LastIndexOf("\\") - 1);

                Stream myStream1, myStream2;

                BufferedStream myBStream1, myBStream2;

                byte[] myByte = new byte[1024];

                int i;

                myStream1 = File.OpenRead(str1);

                myStream2 = File.OpenWrite(str2);

                myBStream1 = new BufferedStream(myStream1);

                myBStream2 = new BufferedStream(myStream2);

                i = myBStream1.Read(myByte, 0, 1024);

                while (i > 0)

                {

                    myBStream2.Write(myByte, 0, i);

                    i = myBStream1.Read(myByte, 0, 1024);

                }

                myBStream2.Flush();

                myStream1.Close();

                myBStream2.Close();

                MessageBox.Show("文件复制完成");

            }

            catch(Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

}

9、如何使用GzipStream压缩文件?

GzipStream类位于System.IO.Compression命名空间下,提供用于压缩和解压缩流的方法和属性。该类表示GZip数据格式,这种格式包括一个检测数据损坏的循环冗余校验值。当使用GzipStream类构造一个压缩流后,就可以使用该类的Write方法写数据,从而实现压缩功能。

  1. Write方法实现从指定的字节数组中将要压缩的字节写入基础流。语法如下:

Public override void Write(byte[] array,int offset, int count)

参数说明:(1)array 用于存储要压缩字节的数组。(2)offset 数组中开始读取的位置(2)count 压缩的字节数。

using System.IO.Compression;

namespace GZipFile

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.Filter = "所有文件(*.*)|*.*";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

            {

                textBox1.Text = openFileDialog1.FileName;

            }

        }

        private void button2_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(textBox1.Text))

            {

                MessageBox.Show("请选择源文件!", "信息提示");

                return;

            }

            if (String.IsNullOrEmpty(textBox2.Text))

            {

                MessageBox.Show("请输入压缩文件名!", "信息提示");

                return;

            }

            string str1 = textBox1.Text;

            string str2 = textBox2.Text.Trim();

            byte[] myByte = null;

            FileStream myStream = null;

            FileStream myDesStream = null;

            GZipStream myComStream = null;

            try

            {

                myStream = new FileStream(str1, FileMode.Open, FileAccess.Read, FileShare.Read);

                myByte = new byte[myStream.Length];

                myStream.Read(myByte, 0, myByte.Length);

                myDesStream = new FileStream(str2, FileMode.OpenOrCreate, FileAccess.Write);

                myComStream = new GZipStream(myDesStream, CompressionMode.Compress, true);

                myComStream.Write(myByte, 0, myByte.Length);

                MessageBox.Show("压缩文件完成!");

            }

            catch { }

            finally

            {

                myStream.Close();

                myComStream.Close();

                myDesStream.Close();

            }

        }

    }

}

10、如何使用Gzip解压文件

思路:使用GzipStream类的Read方法读取数据,从而实现解压缩。语法如下:

Public override int Read(byte[] array,int offset,int count)。

参数说明:(1)array 用于存储压缩的字节的数组。(2)offset 数组中开始读取的位置(3)count 解压缩的字节数。(4)返回值 解压缩到字节数组中的字节数。如果已到达流的末尾,则返回0或读取的字节数

using System.IO.Compression;

namespace UnGzipFile

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.Filter = "压缩文件(*.gzip)|*.gzip";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

            {

                textBox1.Text = openFileDialog1.FileName;

            }

        }

        private void button2_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(textBox1.Text))

            {

                MessageBox.Show("请选择GZIP文件!", "信息提示");

                return;

            }

            if (String.IsNullOrEmpty(textBox2.Text))

            {

                MessageBox.Show("请输入解压文件名!", "信息提示");

                return;

            }

            string str1 = textBox1.Text;

            string str2 = textBox2.Text.Trim();

            byte[] myByte = null;

            FileStream myStream = null;

            FileStream myDesStream = null;

            GZipStream myDeComStream = null;

            try

            {

                myStream = new FileStream(str1, FileMode.Open);

                myDeComStream = new GZipStream(myStream, CompressionMode.Decompress, true);

                myByte = new byte[4];

                int myPosition = (int)myStream.Length - 4;

                myStream.Position = myPosition;

                myStream.Read(myByte, 0, 4);

                myStream.Position = 0;

                int myLength = BitConverter.ToInt32(myByte, 0);

                byte[] myData = new byte[myLength + 100];

                int myOffset = 0;

                int myTotal = 0;

                while (true)

                {

                    int myBytesRead = myDeComStream.Read(myData, myOffset, 100);

                    if (myBytesRead == 0)

                        break;

                    myOffset += myBytesRead;

                    myTotal += myBytesRead;

                }

                myDesStream = new FileStream(str2, FileMode.Create);

                myDesStream.Write(myData, 0, myTotal);

                myDesStream.Flush();

                MessageBox.Show("解压文件完成!");

            }

            catch { }

            finally

            {

                myStream.Close();

                myDeComStream.Close();

                myDesStream.Close();

            }

        }

    }

}

11、调用WinRAR实现文件的压缩和解压

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Web; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.Diagnostics; 

using System.IO; 

public partial class Zip : System.Web.UI.Page 

    protected void Page_Load(object sender, EventArgs e) 

    { 

    } 

    //压缩文件 

    protected void Button1_Click(object sender, EventArgs e) 

    { 

        ProcessStartInfo startinfo = new ProcessStartInfo(); ; 

        Process process = new Process(); 

        string rarName = "1.rar"; //压缩后文件名 

        string path = @"C:\images"; //待压缩打包文件夹 

        string rarPath = @"C:\zip";  //压缩后存放文件夹 

        string rarexe = @"c:\Program Files\WinRAR\WinRAR.exe";  //WinRAR安装位置 

        try 

        { 

            //压缩命令,相当于在要压缩的文件夹(path)上点右键->WinRAR->添加到压缩文件->输入压缩文件名(rarName) 

            string cmd = string.Format("a {0} {1} -r", 

                                rarName, 

                                path); 

            startinfo.FileName = rarexe; 

            startinfo.Arguments = cmd;                          //设置命令参数 

            startinfo.WindowStyle = ProcessWindowStyle.Hidden;  //隐藏 WinRAR 窗口 

            startinfo.WorkingDirectory = rarPath; 

            process.StartInfo = startinfo; 

            process.Start(); 

            process.WaitForExit(); //无限期等待进程 winrar.exe 退出 

            if (process.HasExited) 

            { 

                MSCL.JsHelper.Alert("压缩成功!", Page); 

            } 

        } 

        catch (Exception ex) 

        { 

            MSCL.JsHelper.Alert(ex.Message, Page); 

        } 

        finally 

        { 

            process.Dispose(); 

            process.Close(); 

        }         

    } 

    //解压文件 

    protected void Button2_Click(object sender, EventArgs e) 

    { 

        ProcessStartInfo startinfo = new ProcessStartInfo(); ; 

        Process process = new Process(); 

        string rarName = "1.rar"; //将要解压缩的 .rar 文件名(包括后缀) 

        string path = @"C:\images1"; //文件解压路径(绝对) 

        string rarPath = @"C:\zip";  //将要解压缩的 .rar 文件的存放目录(绝对路径) 

        string rarexe = @"c:\Program Files\WinRAR\WinRAR.exe";  //WinRAR安装位置 

        try 

        { 

            //解压缩命令,相当于在要压缩文件(rarName)上点右键->WinRAR->解压到当前文件夹 

            string cmd = string.Format("x {0} {1} -y", 

                                rarName, 

                                path); 

            startinfo.FileName = rarexe; 

            startinfo.Arguments = cmd;                          //设置命令参数 

            startinfo.WindowStyle = ProcessWindowStyle.Hidden;  //隐藏 WinRAR 窗口 

            startinfo.WorkingDirectory = rarPath; 

            process.StartInfo = startinfo; 

            process.Start(); 

            process.WaitForExit(); //无限期等待进程 winrar.exe 退出 

            if (process.HasExited) 

            { 

                MSCL.JsHelper.Alert("解压缩成功!", Page); 

            } 

        } 

        catch (Exception ex) 

        { 

            MSCL.JsHelper.Alert(ex.Message, Page); 

        } 

        finally 

        { 

            process.Dispose(); 

            process.Close(); 

        }    

    } 

}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 065.JAVA输入输出_包装流的概念和缓冲流
    1. 包装流的概念2. 缓冲流 2.1. 缓冲流的概述 2.1.1. 缓冲流读取文件的过程 2.2. 字节缓冲流 2.2.1. 字节输入缓冲流常用构造器2.2.2. 字节输出缓冲流常用构造器2.2.3. 用法实例 2.3. 字符缓冲流 2.3.1. 输入流增强的方法2.3.2. 输出流增强的方法 1. 包装流的概念 处理流/包装流(相对于节点流更高级): 隐藏了底层的节点流的差异, 并对外提供了更方便的输入/输出功能,让开发者只需要关注高级流的操作, 是对字节流的一种增强操作.使用处理流包装了节点流程序直接操作处理流, 让节点流与底层的设备做 io 操作.只需要关闭处理流即可. 包装流如何区分:在创建流对象的时候需要传递另一个流对象, 这种流对象就是包装流对象.例如: new包装流(流对象); 博主的 Github 地址 2. 缓冲流 2.1. 缓冲流的概述 是一个包装流, 目的起缓存作用, 缓冲流还能优化 io 效率, 使速度提升.因此操作字节或字符流的时候, 都建议使用缓冲流进行包装, 提高运行效率. 缓冲流一共有四种: BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter 直接操作的缺陷:操作流的时候习惯定义一个 byte/char 数组.int read() 方法每次都从磁盘文件中读取一个字节
  • 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)
    前言 在上一篇的文章获取不错的浏览量后,继续加更的念头一直徘徊在心中,本来是想花段时间深入学习tomcat的,可是tomcat的源码中就有至关重要的NIO,于是得先整一下NIO,但是NIO的基础是BIO,于是这篇文章就先写IO流吧。 学习NIO(非阻塞IO),千万不能被IO阻塞住哇! IO流在java中其实是很重要的一块知识点,难度还好,但是容易被忽视,因为工作中真正写IO的代码少之又少。 IO的难点在于 IO流api很多,各种基础的流,包装的流嵌套使用很难记忆基本每个方法都要抛出非运行时异常导致很多开发学过io流一段时间后,写不出一段正确的io流代码。 本文将从理论+代码的方式由浅入深的带大家学习IO流,通过图解的方式来记忆常用的IO流。 文末有IO总结的思维导图,很多博文采用的都是上来一张图,我觉得对于阅读者来说很容易陷进去,所以建议理清各个流后再去看思维导图。 File在正式的介绍IO流之前,我觉得应该介绍一下File类,该类主要是对文件和目录的抽象表示,因为学习io流第一反应就是文件,该类提供了对文件的创建、删除、查找等操作。主要有以下特点 java的世界万物皆对象,文件和目录就可抽象为File对象 对于File而言,封装的并不是真正的文件,封装的仅仅是一个路径名,磁盘文件本身可以存在,也可以不存在 文件的内容不能用File读取,而是通过流来读取
  • Java 基础(四)| IO 流之使用文件流的正确姿势
    为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。一、什么是 IO 流?想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中。那这个看似简单的过程,背后其实是数据的传输。数据的传输,也就是数据的流动。既然是流动也就会有方向,有入方向和出方向。举个上传文件的栗子,现在有三个对象,文件、应用程序、上传的目标地址(服务器)。简化的上传文件有两步:应用程序读文件(此为入方向,文件读入到应用程序)应用程序写文件(此为出方向,读完之后写到目标地址)注意这个入和出是相对的,它相对于应用程序而言。如果相对于服务器而言,这个上传文件操作就是入方向,从应用程序读入。Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。二、IO 流的分类我不认同网络上很多 IO 流的图,他们只是简单的把 io 流分成字节流和字符流。这样的分类也不是说不好,只是太臃肿、难记。先上一张我自己总结的 IO 留的思维导图,我先把它分成了节点流和处理流,节点流是直接接触数据源的,而处理流是出于各种目的在节点流的基础上再套一层的 IO 流。再按照操作类型,分成 8 个小类,然后才是字节、字符分类,最后才是输入、输出的分类
  • IO流的总结
    1:IO流的原理 IO是Input/Output的缩写,用于处理设备之间的数据传输,如读写文件、网络通讯Java程序中,对于数据的输入/输出操作以“流”的方式进行java.io包下提供了各种流的接口和类,通过标准的方法输入或输出数据 2:流的分类 2.1:节点流和处理流的区别 处理流需要包装在节点流上 2.2:IO的体系 2.3:InputStream & Reader 的介绍 2.3.1:InputStream的方法 2.3.2:Reader的方法 2.4:OutputStream & Writer的介绍 2.4.1:OutputStream的常用方法 2.4.2:Writer的常用方法 2.5:举例说明 1: File file = new File("hello.txt");// F:\javaSenior\hello.txt 相较于当前工程,不是想当于module下面 System.out.println(file.getAbsolutePath()); File file1 = new File("day09\\hello.txt");//F:\javaSenior\day09\hello.txt System.out.println(file1.getAbsolutePath()); 在IDEA中,在main()方法里面创建的文件的路径是相对于工程下面的
  • Java IO——字节流和字符流详解&区别对比
    Java IO——字节流和字符流详解&区别对比 概述 大多数应用程序都需要实现与设备之间的数据传输,在Java中,将这种通过不同输入输出设备(例如:输入设备、内存、显示器、网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。 IO流,即InputOutput的缩写。 Java IO库有两个支系: 面向字节流的InputStream和OutputStream面向字符的Reader和Writer java流在处理上分为字符流和字节流。实际上字节流的InputStream和OutputStream是一切的基础。实际总线中流动的只有字节流。需要对字节流做特殊解码才能得到字符流。Java中负责从字节流向字符流解码的桥梁是:InputStreamReader和InputStreamWriter。 字节流&字符流 大多数情况下,字节是数据最小的基本单位,1 byte = 8 bit,而 1 char = 2 byte = 16 bit。 流 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 Java中的流是对字节序列的抽象
  • IO流的魅力
    从java看IO流 前言一、流的概念二、流的结构1.输入输出类库分类2. IO常用类 总结 前言 在计算机程序的所有操作中,几乎具备输入输出操作。通过输入和输出操作,可以更好地从外界获取信息,或者是把信息传递给外界,在java语言中,这些操作以流的形式来实现。 一、流的概念 流(Stream)是指计算机各部件之间的数据流动。之所以被称为IO,是因为java中处理数据的流被分为输入流(Input Stream)和输出流(Output Stream),对于不同文件的格式和性质来说,java类库里存在着不同的流类来实现文件的数据传输。 二、流的结构 1.输入输出类库分类 输入流程序可以从中读取数据的流。特点:能够向输入流中添加数据 输出流:程序能向其中写入数据的流。特点:能够从输入流里取得数据。 | 输入流输出流InputStreamOutputStreamReaderWriter 2. IO常用类 JDK所提供的所有流类位于java.io包中,具体分为以下四类。 字节流 InputStream:继承自InputStream的流都是用于向程序中输入数据的。 OutputStream:继承自OutputStream的流都是程序用于向外输出数据的。 字符流 Reader:继承自Reader的流都是用于向程序中输入数据的。 Writer:继承自Writer的流都是程序用于向外输出数据的。
  • 最详细的Java知识点--字节流、字符流
    字节流、字符流主要内容IO流字节流字符流异常处理Properties目标能够说出IO流的分类和功能能够使用字节输出流写出数据到文件能够使用字节输入流读取数据到程序能够理解读取数据read(byte[])方法的原理能够使用字节流完成文件的复制能够使用FileWirter写数据到文件能够说出FileWriter中关闭和刷新方法的区别能够使用FileWriter写数据的5个方法能够使用FileWriter写数据实现换行和追加写能够使用FileReader读数据能够使用FileReader读数据一次一个字符数组能够使用Properties的load方法加载文件中配置信息第一章 IO概述1.1 什么是IO生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。1.2 IO的分类根据数据的流向分为:输入流和输出流。输入流 :把数据从其他设备上读取到内存中的流
  • 深入学习JAVA -IO流详解
    目录 (一)IO流基本概念(二)文件字节输入流(2.1)使用输入流的4个基本步骤(2.2)构造方法(2.2)使用输入流读取文件 (三)文件字节输出流(3.1)使用输出流的4个基本步骤(3.2)构造方法(3.3)使用输出流写字节 (四)文件字符输入、输出流(五)缓冲流(5.1)缓冲流概述(5.2)构造方法 (六)随机流(6.1)概述(6.2)构造方法 (七)数组流(八)数据流(8.1)概述(8.2)代码实现 (九)对象流 (一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。 (二)文件字节输入流 (2.1)使用输入流的4个基本步骤 1.设定输入流的源。 2.创建指向源的输入流。 3.让输入流读取源中的数据。 4.关闭输入流。 (2.2)构造方法 如果对文件读取需求比较简单,从文件系统中的某个文件中获得输入字节,可以使用文件字节输入流FileInputStream类。 构造方法: // 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定 FileInputStream(File file) //
  • 用C代码代表EOF吗?(Representing EOF in C code?)
    问题 在C代码中,换行符由"\n"表示。 文件末尾(EOF)字符是否等效? 回答1 EOF不是字符(在大多数现代操作系统中)。 当到达文件流的末尾时,这只是一个适用于文件流的条件。 出现混乱的原因是,用户可以通过键入特殊字符(例如Unix,Linux等中的Control-D)向控制台输入EOF信号,但是正在运行的程序看不到该字符,因此操作系统会捕获该字符。依次向过程发送EOF信号。 注意:在某些非常老的操作系统中,EOF是一个字符,例如CP / M中的Control-Z,但这是一个粗略的技巧,以避免维护文件系统目录中实际文件长度的开销。 回答2 不。EOF不是字符,而是文件句柄的状态。 尽管ASCII字符集中有一些控制字符代表数据的结尾,但通常这些字符不用于表示文件的结尾。 例如,EOT(^ D)在某些情况下几乎表示相同。 当标准C库使用带符号的整数返回字符并使用-1作为文件结尾时,实际上这只是表明发生了错误的信号。 我没有可用的C标准,但引用SUSv3: 如果设置了流的文件结束指示符,或者流在文件末尾,则应设置流的文件结束指示符,并且fgetc()将返回EOF。 如果发生读取错误,则应设置流的错误指示符,fgetc()将返回EOF,并应将errno设置为指示错误。 回答3 EOF不是字符。 不能是:(二进制)文件可以包含任何字符。 假设您的文件的字节数不断增加,依次为0 1 2
  • 为什么分叉我的进程导致文件被无限读取(Why does forking my process cause the file to be read infinitely)
    问题 我将整个程序简化为可重复该问题的简短主程序,因此请原谅我没有任何意义。 input.txt是一个文本文件,其中包含几行文本。 这个煮好的程序应该打印那些行。 但是,如果调用fork,程序将进入一个无限循环,在该循环中,它将一遍又一遍地打印文件的内容。 据我了解,在本摘要中使用fork的方式本质上是禁止操作的。 它分叉,父母等待孩子继续前进,孩子立即被杀死。 #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> enum { MAX = 100 }; int main(){ freopen("input.txt", "r", stdin); char s[MAX]; int i = 0; char* ret = fgets(s, MAX, stdin); while (ret != NULL) { //Commenting out this region fixes the issue int status; pid_t pid = fork(); if (pid == 0) { exit(0); } else { waitpid(pid, &status, 0); } //End region printf("%s", s); ret = fgets(s, MAX
  • 还在迷茫于java的文件操作吗?来看看Java文件操作的套路 - Java基础
    JavaSE - 对于文件操作的介绍 文章目录 一、IO原理二、"流" 简介流的分类流的结构 三、代码实现 字符流操作文本文件的实现:字符流简介FileReader读取文件打印到控制台① 利用read()空参方法进行读取② 利用read(char[] c)方法进行读取<1> 错误的写法:<2> 正确的写法: FileWriter内存中写出到文件① 覆盖写出(覆盖文件中原有数据)② 追加写出(在原有数据后面追加) 文件的复制(前两个结合起来) 字节流操作非文本文件的实现:字节流简介FileInputStream && FileOutputStream实现图片(非文本)的复制 通用方法实现指定路径下文件的复制,并获取耗时 🔺缓冲流来进行数据处理(效率高)BufferedInputStream && BufferedOutputStream 实现复制操作为什么缓冲流的效率高?BufferedReader && BufferedWriter 实现文本文档复制①方式一:使用write(char[] , 0 , len)写入:②使用write(String )进行写入: 转换流(分辨也是看后缀)- 相对难作用InputStreamReader实现字节的输入流到字符的输入流的转换InputStreamReader 和 OutputStreamWriter综合(将UTF-8的转为gbk的存储)
  • Java笔记:IO流
    1. File 类的使用 java.io.File 类:文件和文件目录路径的抽象表示形式File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身想要在 Java 程序中表示一个真实存在的文件或目录,那么把徐有一个 File 对象,但是 Java 程序中的一个 File 对象,可能没有一个真实存在的文件或目录File 对象可以作为参数传递给流的构造器 1.1 创建 File 类的实例 File(String pathname)public void test() throws Exception { // 相对路径:相较于某个路径下指明的路径 File file1 = new File("hello.txt"); // 绝对路径:包含盘符在内的文件或文件目录的路径 File file2 = new File("D:\\IdeaProjects\\Dudu\\he.txt"); System.out.println(file1);// hello.txt System.out.println(file2);// D:\IdeaProjects\Dudu\he.txt } File(String parent, String child)public void test() throws Exception { File file3 = new File("D:\
  • 字节流和字符流详解
    1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 2.流的分类 按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱) 按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位); 字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位); 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能
  • Java字节流与字符流及文件操作
    目录 Java.io知识点梳理File类字节流OutputStream字节流InputStream字符流Writer字符流Reader字节流与字符流的转换(了解)字节流与字符流的区别?两者如何使用? Java.io知识点梳理 如果要进行所有的文件以及文件内容的开发操作,应该使用java.io包完成,而在java.io包里面一共有五个核心类和一个核心接口: 五个核心类:File、InputStream、OutputStream、Reader、Writer一个核心接口:Serializable File类 在整个java.io包里面,File类是唯一一个与文件本身操作有关的类 ,但是不涉及到文件的具体内容,所谓的文件本身,指的是文件的创建和删除等。 几个重点掌握方法: 1.构造方法:public File(String pathname) 设置文件路径 2.普通方法:public boolean delete(); 删除文件 3.普通方法:public boolean exists()判断文件是否存在 4.普通方法:public File getParentFile();public String getParentFile();得找到父路径 5.普通方法:public Boolean mkdirs() 创建多级子目录 6普通方法:.public long length()
  • Node.js流如何工作?(How do Node.js Streams work?)
    问题 我有一个关于Node.js流的问题-特别是它们在概念上如何工作。 不缺少有关如何使用流的文档。 但是我很难找到流在数据级别如何工作。 我对Web通信HTTP的有限理解是,来回发送完整的数据“包”。 类似于个人订购公司目录,客户端向服务器发送GET(目录)请求,然后服务器以目录进行响应。 浏览器不会收到目录的页面,而是会收到整本书。 节点流可能是多部分消息吗? 我喜欢REST模型-尤其是它是无状态的。 浏览器和服务器之间的每一次交互都是完全自给自足的。 因此,节点流不是RESTful的吗? 一位开发人员提到与插座管的相似之处,插座使连接保持打开状态。 回到我的目录订购示例,这就像是一条信息电视广告,其行为“但是,等等!还有更多!” 而不是完全包含的目录? 流的很大一部分是接收器“下游”能够在上游发送“暂停”和“继续”之类的消息的能力。 这些消息由什么组成? 他们是POST吗? 最后,我对Node工作原理的有限视觉理解包括此事件循环。 可以将函数放置在与线程池分离的线程上,然后事件循环继续进行。 但是,在数据流完成之前,是否不应该发送数据流使事件循环占据(即停止)? 还如何监视下游的“暂停”请求?n事件循环是否将流放在池中的另一个线程上,并且当遇到“暂停”请求时,检索相关线程并暂停它? 我已经阅读了node.js文档,完成了nodeschool教程,构建了一个heroku应用
  • java字节流详解(有例子)
    1.1 什么是IO生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。1.2 IO的分类根据数据的流向分为:输入流和输出流。输入流 :把数据从其他设备上读取到内存中的流。输出流 :把数据从内存 中写出到其他设备上的流。格局数据的类型分为:字节流和字符流。字节流 :以字节为单位,读写数据的流。字符流 :以字符为单位,读写数据的流。1.3 顶级父类们输入流输出流字节流字节输入流InputStream字节输出流OutputStream字符流字符输入流Reader字符输出流Writer第二章 字节流2.1 一切皆为字节一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。2.2
  • fflush和fsync之间的区别(Difference between fflush and fsync)
    问题 我认为fsync()在内部执行fflush() ,因此在流上使用fsync()可以。 但是在网络I / O下执行时,我得到了意外的结果。 我的代码段: FILE* fp = fopen(file, "wb"); /* multiple fputs() calls like: */ fputs(buf, fp); ... ... fputs(buf.c_str(), fp); /* get fd of the FILE pointer */ fd = fileno(fp); #ifndef WIN32 ret = fsync(fd); #else ret = _commit(fd); fclose(fp); 但是_commit()似乎没有刷新数据(我在Windows上尝试过,并且该数据写在Linux导出的文件系统上)。 当我将代码更改为: FILE* fp = fopen(file, "wb"); /* multiple fputs() calls like: */ fputs(buf, fp); ... ... fputs(buf.c_str(), fp); /* fflush the data */ fflush(fp); fclose(fp); 它刷新数据。 我想知道_commit()是否与fflush()相同。 有输入吗? 回答1 fflush()在FILE*
  • C ++文件处理:ios :: app和ios :: ate之间的区别?(C++ Filehandling: Difference between ios::app and ios::ate?)
    问题 写入文件时, ios::ate和ios:app什么区别? 在我看来, ios::app使您能够在文件中四处移动,而使用ios::ate它只能在文件末尾读取/写入。 这样对吗? 回答1 相反。 设置ios::ate ,初始位置将是文件的末尾,但此后您可以自由查找。 设置ios::app ,所有输出操作均在文件末尾执行。 由于所有写操作都隐含在查找之前,因此无法在其他地方写操作。 回答2 它们被指定如下(在C ++ 11的27.5.3.1.4中): app试图在每次写入之前结束 ate开,并试图在开封后立即结束 使用ios::app ,文件中的写入位置为“粘滞”-无论您在哪里寻找,所有写入都在末尾。 回答3 这是很好的记录在这里。 ios::ate “将流的位置指示器设置为打开时流的末尾。” ios::app “在每次输出操作之前,将流的位置指示器设置为流的末尾。” 这意味着区别是ios::ate在打开文件时将您的位置放到文件的末尾。 每次刷新流时, ios::app将其放在文件末尾。 例如,如果您有两个写入同一日志文件ios::ate将覆盖自另一个程序自该程序打开以来添加到该文件中的所有内容。 每次程序添加日志条目时, ios:app都会跳至文件末尾。 回答4 ios::app >“我们无法移动指针。它只会在结尾。” ios::ate >“我们可以将记录指针移到任何其他位置。”
  • 2.8W字Java基础学习和书籍推荐,真正意义上的从0到1学Java,才不是培训机构那种大纲文
    前言 在网上一搜索Java学习会弹出无数文章,但全都是培训机构的大纲文,实在鸡肋,根本没写一个字是在帮助菜鸟怎么认识Java的,所以我琢磨着写一篇真正意义上的Java从0到1的文章,帮0基础的小白和初学的财年打开Java的大门 如果观察过招聘网站上的Java相关岗位需求就会发现,抛开其它的经验能力等等,单纯从技术,或者说知识上来讲,可以发现一些共通的地方。 Java基础 计算机基础 数据库,SQL/NoSQL 常用开源框架 分布式/微服务 中间件,缓存、消息中间件 学习任何一门编程语言,首先要学习的是基础语法,开启Java学习的第一步,当然就是深入掌握计算机基础、编程基础语法,面向对象,集合、IO流、线程、并发、异常及网络编程,这些我们称之为JavaSE基础。当你掌握了这些内容之后,你就可以做出诸如:电脑上安装的迅雷下载软件、QQ聊天客户端、考勤管理系统等桌面端软件。 而这篇文章要写的,就是Java基础,有人看的话后面可能也会继续写计算机基础、数据库和框架这些。 在文末我也整理了一份书单Java架构师学习核心书单,各位可以按照自己的学习进度去酌情购买,如果是学生或者最近手头紧,也没有关系,我给大家收集了电子档,可以自行点击蓝字领取。 22本Java架构师核心书籍 从0到1Java学习路线和资料 1000+道2021年最新面试题 话不多说,坐稳扶好,发车喽! 一、Java基础语法
  • 2.8W字Java基础学习和书籍推荐,真正意义上的从0到1学Java,才不是培训机构那种大纲文
    前言 在网上一搜索Java学习会弹出无数文章,但全都是培训机构的大纲文,实在鸡肋,根本没写一个字是在帮助菜鸟怎么认识Java的,所以我琢磨着写一篇真正意义上的Java从0到1的文章,帮0基础的小白和初学的财年打开Java的大门 如果观察过招聘网站上的Java相关岗位需求就会发现,抛开其它的经验能力等等,单纯从技术,或者说知识上来讲,可以发现一些共通的地方。 Java基础 计算机基础 数据库,SQL/NoSQL 常用开源框架 分布式/微服务 中间件,缓存、消息中间件 学习任何一门编程语言,首先要学习的是基础语法,开启Java学习的第一步,当然就是深入掌握计算机基础、编程基础语法,面向对象,集合、IO流、线程、并发、异常及网络编程,这些我们称之为JavaSE基础。当你掌握了这些内容之后,你就可以做出诸如:电脑上安装的迅雷下载软件、QQ聊天客户端、考勤管理系统等桌面端软件。 而这篇文章要写的,就是Java基础,有人看的话后面可能也会继续写计算机基础、数据库和框架这些。 在文末我也整理了一份书单Java架构师学习核心书单,各位可以按照自己的学习进度去酌情购买,如果是学生或者最近手头紧,也没有关系,我给大家收集了电子档,可以自行点击蓝字领取。 22本Java架构师核心书籍 从0到1Java学习路线和资料 1000+道2021年最新面试题 话不多说,坐稳扶好,发车喽! 一、Java基础语法