我創建了一個表單來將資料寫入文本檔案并從文本檔案中讀取資料。如果我運行程式并將資料寫入文本檔案,程式運行良好。資料被保存到檔案中。然后我停止程式并重新運行它,現在從檔案中讀取資料,文本資料也顯示在相應的文本框中。
但是當我將資料寫入文本檔案然后嘗試從文本檔案中讀取資料而不重新運行程式時會出現問題。現在在這種情況下,它顯示錯誤:Stream was not readable.
為什么會這樣?
Imports System.IO
Public Class Form1
Dim fileStream_ As FileStream
Dim fileWrite_ As StreamWriter
Dim fileRead_ As StreamReader
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
fileStream_ = New FileStream("C:\Users\USER\Desktop\demo\vb.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
' for WRITE data to text file
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
fileWrite_ = New StreamWriter(fileStream_)
fileWrite_.Write(TextBox1.Text)
fileWrite_.Close()
MsgBox("Text written to file", MsgBoxStyle.Information)
TextBox1.Text = ""
TextBox2.Text = ""
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
' for READ data from text file
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
fileRead_ = New StreamReader(fileStream_)
TextBox2.Text = fileRead_.ReadToEnd
fileRead_.Close()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
End Class

uj5u.com熱心網友回復:
不要保留這些全域變數,因為您并不真正需要它們。
當由于某種原因它們不再有效時,它們可能會在你的腳下射擊。
你的例子是全域變數引入了微妙而不明顯的錯誤。當您關閉 StreamWriter 時,fileStream_變數會自動釋放,并且在單擊下一個按鈕時不再可用。
當然,如果您關閉/重新打開應用程式并直接讀取檔案,它就可以作業。但是,這將是寫入失敗。
而是使用Using 陳述句正確處理所有一次性物件,例如 StreamWriter、StreamReader 或 FileStream
所以你的點擊處理程式可以重寫為
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Using fileStream_ As FileStream = New FileStream("C:\Users\USER\Desktop\demo\vb.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
Using fileWrite_ As StreamWriter = New StreamWriter(fileStream_)
fileWrite_.Write(TextBox1.Text)
' the call to close is no more needed when inside the using
' fileWrite_.Close()
MsgBox("Text written to file", MsgBoxStyle.Information)
TextBox1.Text = ""
TextBox2.Text = ""
End Using
End Using
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
Using fileStream_ As FileStream = New FileStream("C:\Users\USER\Desktop\demo\vb.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
Using fileRead_ As StreamReader = New StreamReader(fileStream_)
TextBox2.Text = fileRead_.ReadToEnd
End Using
End Using
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
但是,除非您有一些正當理由讓這些 Streams 存在,否則您可以使用一條陳述句對所有內容進行編碼。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
File.WriteAllText("C:\Users\USER\Desktop\demo\vb.txt", TextBox1.Text)
MsgBox("Text written to file", MsgBoxStyle.Information)
TextBox1.Text = ""
TextBox2.Text = ""
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
TextBox2.Text = File.ReadAllText("C:\Users\USER\Desktop\demo\vb.txt")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
當您需要處理檔案時, File 類有許多有用的方法
uj5u.com熱心網友回復:
當您關閉撰寫器時,底層流也會關閉,如果您需要從同一個檔案中讀取,則需要創建一個新的流實體。
參考:https ://docs.microsoft.com/en-us/dotnet/api/system.io.streamwriter.close?view=net-6.0
Imports System.IO
Public Class Form1
Dim fileStream_ As FileStream
Dim fileWrite_ As StreamWriter
Dim fileRead_ As StreamReader
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
' for WRITE data to text file
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
fileStream_ = New FileStream("C:\Users\USER\Desktop\demo\vb.txt", FileMode.OpenOrCreate, FileAccess.Write)
fileWrite_ = New StreamWriter(fileStream_)
fileWrite_.Write(TextBox1.Text)
fileWrite_.Close()
MsgBox("Text written to file", MsgBoxStyle.Information)
TextBox1.Text = ""
TextBox2.Text = ""
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
' for READ data from text file
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
fileStream_ = New FileStream("C:\Users\USER\Desktop\demo\vb.txt", FileMode.OpenOrCreate, FileAccess.Read)
fileRead_ = New StreamReader(fileStream_)
TextBox2.Text = fileRead_.ReadToEnd
fileRead_.Close()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
End Class
我還建議您使用“Using”陳述句包裝流,以便更好地管理資源
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/454288.html
標籤:VB.net
