关于用Java编写文件的怪异问题 [英] Weird problem about writing a file in Java
问题描述
启动程序时,它将使用3个名为input.txt
,data.txt
和output.txt
的参数.它将data.txt
中的歌曲信息保存到LinkedList
,并通过处理input.txt
中的命令来执行操作. input.txt
中的某些命令(例如,列表)将信息打印到output.txt
文件中.
When starting my program it takes 3 arguments named input.txt
, data.txt
and output.txt
. It saves the information of the songs in the data.txt
to the LinkedList
and performs operations by processing the commands in the input.txt
. Some commands in input.txt
(eg List) print information to the output.txt
file.
input.txt的内容:
Content of input.txt:
Add id:12 name:"Sandik" singer:"Muslum Gurses" year:2009 count:5 price:20
Add id:15 singer:"Tarkan" name:"Adimi Kalbine Yaz" year:2010 count:10 price:20
Add id:20 name:"Fear of the Dark" singer:"Iron Maiden" year:1992 count:20 price:15
Add id:25 name:"Dark Side of the moon" singer:"Almora" year:1987 count:5 price:10
Remove id:12
List
Edit id:15 singer:"Tarkan Tevetoglu"
Search "ark"
Sell 20
List
Quit
data.txt的内容:
Content of data.txt:
<id>; <price>; <name>; <singer>; <year>; <count>
15;20;Adimi Kalbine Yaz; Tarkan Tevetoglu;2010;10
12;20;Sandik;Muslum Gurses;2009;5
20;15;Fear of the Dark;Iron Maiden;1992;20
预期的output.txt:
Expected output.txt:
New CD added id: 12 name:"Sandik"
New CD added id: 15 name:"Adimi Kalbine Yaz"
New CD added id: 20 name:"Fear of the Dark"
New CD added id: 25 name:"Dark Side of the moon"
CD removed id: 12
List (12 is removed)
Id Price Name Singer Year Count
-----------------------------------------------------------------------
15 20 Adimi Kalbine Yaz Tarkan 2010 10
25 10 Dark Side of the moon Almora 1984 5
20 20 Fear of the Dark Iron Maiden 1992 20
Edit CD id: 15
Id Price Name Singer Year Count
----------------------------------------------------------------------------
15 20 Adimi Kalbine Yaz Tarkan Tevetoglu 2010 10
Id Price Name Singer Year Count
-----------------------------------------------------------------------
15 20 Adimi Kalbine Yaz Tarkan 2010 10
25 10 Dark Side of the moon Almora 1984 5
20 20 Fear of the Dark Iron Maiden 1992 20
Search "ark"
Id Price Name Singer Year Count
-----------------------------------------------------------------------
25 10 Dark Side of the moon Almora 1984 5
20 20 Fear of the Dark Iron Maiden 1992 20
CD sold id: 20
Id Price Name Singer Year Count
-----------------------------------------------------------------------
15 20 Adimi Kalbine Yaz Tarkan 2010 10
25 10 Dark Side of the moon Almora 1984 5
20 20 Fear of the Dark Iron Maiden 1992 20
Quit
Cash: 20
Best Seller: Fear of the Dark
我的程序包含2个类,分别为Main
和LinkedList
.我写了这个程序,一切正常.但是,在开发程序时,我正在控制台上进行实验.我完成了程序,并且在更改打印部分以打印到文件而不是控制台时,我的程序爆炸了.在解释导致问题的部分之前,我想分享我的代码.
My program consists of 2 classes, Main
and LinkedList
. I wrote this program and everything is ok. However, while the program was being developed, I was doing my experiments on the console. I finished the program and while I was changing the print parts to print to the file instead of the console, my program exploded. Before I explain the part that causes the problem, I want to share my code.
主类:
import java.io.*;
import java.util.Scanner; // Import the Scanner class to read text files
public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
//FileWriter myWriter = new FileWriter(args[2]);
PrintStream output1 = new PrintStream(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!\"\\w\")\\s+(?!\\w+\")"); //Alternate Solution
String[] parts = data.split("\\s(?=\\w+:)");
String[] parts1 = data.split("(?<!\"\\w\")\\s+(?!\\w+\")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1); //DONE!
output1.print("New CD added id: "+id1+" name: "+name1);
output1.println();
}
case "Search" -> {
output1.print("List:\n");
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey);
output1.println();
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1)); //DONE!
output1.print("CD removed id: "+id1);
output1.println();
}
case "List" -> {
output1.print("List:\n");
LinkedList.printList(list);
output1.println();
}
case "Edit" -> {
output1.print("Edit CD id: "+id1);
output1.println();
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1);
case "name" -> LinkedList.editName(list, id1, name1);
case "year" -> LinkedList.editYear(list, id1, year1); //DONE!
case "count" -> LinkedList.editCount(list, id1, count1);
case "price" -> LinkedList.editPrice(list, id1, price1);
}
output1.println();
}
case ("Sell") -> {
LinkedList.sell(list,id1);
output1.print("CD Sold. ID: "+id1); //DONE!
output1.println();
}
case "Quit" -> {
output1.print("Quit");
output1.println();
output1.print("Cash :"+LinkedList.cash);
output1.println();
}
}
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
output1.close();
}
}
LinkedList类别:
LinkedList Class:
import java.io.IOException;
import java.io.PrintStream;
public class LinkedList {
Node head; // head of list
public String[] args;
static PrintStream output = null;
public LinkedList(String[] args) throws IOException {
this.args = args;
output = new PrintStream(args[2]);
}
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list)
{
Node currNode = list.head;
output.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
output.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
output.println();
}
output.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next; // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next; // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a)
{
Node current = list.head; //Initialize current
output.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("\n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
output.println();
}
current = current.next;
}
}
}
当我运行程序时,打印到output.txt文件的输出不正确,因此我对其进行了调试.当我的程序进入切换结构时,读取了第一个命令add,并执行了操作,一切都很好.直到读取List
命令. List
命令之前的所有命令都可以正常工作,并且一切都很好,但是当读取List
时,LinkedList
类中的printList
函数可以正常工作.一旦运行此行,我的output.txt
文件就会损坏. output.printf ("% s% 10s% 30s% 25s% 15s% 10s", "ID", "Price", "Name", "Singer", "Year", "Count");
When I ran the program, the output printed to the output.txt file was incorrect and I debugged it. When my program came to the switch structure, the first command, add, was read and the operation was performed, everything was fine. Until the List
command is read. All commands before the List
command worked fine and everything was fine, but when List
was read, the printList
function from the LinkedList
class worked. As soon as this line runs, my output.txt
file gets corrupted. output.printf ("% s% 10s% 30s% 25s% 15s% 10s", "ID", "Price", "Name", "Singer", "Year", "Count");
并且每次运行LinkedList
类中的output.print
命令时,我的output.txt
文件都会进一步损坏.我认为问题可能是由2个单独的对象写在同一文件中引起的.我不确定,但是它们可能会发生冲突.我该如何解决这个问题或有更实际的方法?如果您能提供帮助,我将不胜感激.预先感谢.
And every time the output.print
command in the LinkedList
class ran, my output.txt
file was further corrupted. I think the problem may be caused by 2 separate objects writing on the same file. I'm not sure, but they may be conflicting. How can I solve this problem or is there a more practical way? I would be grateful if you could help. Thanks in advance.
推荐答案
例如,我通过将在Main中创建的名为output1的对象发送给在读取和使用add命令时将要调用的函数来解决该问题.在LinkedList类中.
For example, I solved the problem by sending the object named output1 that I created in Main to the function that will be called when the add command is read and using it in the LinkedList class.
LinkedList类别:
LinkedList Class:
import java.io.*;
public class LinkedList {
Node head; // head of list
public String[] args;
public LinkedList(String[] args){
this.args = args;
}
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list, PrintStream x)
{
Node currNode = list.head;
x.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
x.println("\n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
x.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
x.println();
}
x.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next; // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next; // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a, PrintStream y)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a, PrintStream y)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a, PrintStream y)
{
Node current = list.head; //Initialize current
y.printf("\n\n%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("\n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
y.println();
}
current = current.next;
}
}
}
主类:
import java.io.*;
import java.util.Scanner; // Import the Scanner class to read text files
public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
//FileWriter myWriter = new FileWriter(args[2]);
PrintStream output1 = new PrintStream(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!\"\\w\")\\s+(?!\\w+\")"); //Alternate Solution
String[] parts = data.split("\\s(?=\\w+:)");
String[] parts1 = data.split("(?<!\"\\w\")\\s+(?!\\w+\")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1); //DONE!
output1.print("New CD added id: "+id1+" name: "+name1);
output1.println();
}
case "Search" -> {
output1.print("List:\n");
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey,output1);
output1.println();
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1)); //DONE!
output1.print("CD removed id: "+id1);
output1.println();
}
case "List" -> {
output1.print("List:\n");
LinkedList.printList(list,output1);
output1.println();
}
case "Edit" -> {
output1.print("Edit CD id: "+id1);
output1.println();
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1,output1);
case "name" -> LinkedList.editName(list, id1, name1,output1);
case "year" -> LinkedList.editYear(list, id1, year1,output1); //DONE!
case "count" -> LinkedList.editCount(list, id1, count1,output1);
case "price" -> LinkedList.editPrice(list, id1, price1,output1);
}
output1.println();
}
case ("Sell") -> {
LinkedList.sell(list,id1);
output1.print("CD Sold. ID: "+id1); //DONE!
output1.println();
}
case "Quit" -> {
output1.print("Quit");
output1.println();
output1.print("Cash :"+LinkedList.cash);
output1.println();
}
}
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
output1.close();
}
}
这篇关于关于用Java编写文件的怪异问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!