முன்னதாக, IO API (Input/Output Application Programming Interface) மற்றும் java.io தொகுப்பு ஆகியவற்றை நாங்கள் அறிந்தோம் , அதன் வகுப்புகள் முக்கியமாக ஜாவாவில் ஸ்ட்ரீம்களுடன் பணிபுரியும். இங்கே முக்கியமானது ஸ்ட்ரீம் என்ற கருத்து .
இன்று நாம் NIO API (புதிய உள்ளீடு/வெளியீடு) கருத்தில் கொள்ளத் தொடங்குவோம் .
I/O க்கு இரண்டு அணுகுமுறைகளுக்கும் இடையே உள்ள முக்கிய வேறுபாடு என்னவென்றால், IO API ஸ்ட்ரீம்-சார்ந்ததாக இருக்கும் அதே சமயம் NIO API தாங்கல் சார்ந்ததாக உள்ளது. எனவே புரிந்து கொள்ள வேண்டிய முக்கிய கருத்துக்கள் இடையகங்கள் மற்றும் சேனல்கள் .
பஃபர் என்றால் என்ன, சேனல் என்றால் என்ன?
சேனல் என்பது ஒரு தருக்க போர்ட்டல் ஆகும், இதன் மூலம் தரவு உள்ளேயும் வெளியேயும் நகரும் , அதே சமயம் ஒரு இடையகமானது இந்த அனுப்பப்பட்ட தரவின் ஆதாரம் அல்லது இலக்கு. வெளியீட்டின் போது, நீங்கள் அனுப்ப விரும்பும் தரவு ஒரு இடையகத்திற்குள் வைக்கப்படும், மேலும் இடையகமானது தரவை சேனலுக்கு அனுப்புகிறது. உள்ளீட்டின் போது, சேனலில் இருந்து தரவு இடையகத்தில் வைக்கப்படும்.
வேறு வார்த்தைகளில் கூறுவதானால்:
- ஒரு தாங்கல் என்பது நினைவகத்தின் ஒரு தொகுதியாகும், அதில் நாம் தகவலை எழுதலாம் மற்றும் அதில் இருந்து தகவலைப் படிக்கலாம்.
- சேனல் என்பது கோப்புகள் அல்லது சாக்கெட்டுகள் போன்ற I/O சாதனங்களுக்கான அணுகலை வழங்கும் நுழைவாயில் ஆகும்.
சேனல்கள் java.io தொகுப்பில் உள்ள ஸ்ட்ரீம்களைப் போலவே இருக்கும். எங்கும் செல்லும் (அல்லது எங்கிருந்தும் வரும்) எல்லா தரவும் ஒரு சேனல் பொருளின் வழியாக அனுப்பப்பட வேண்டும். பொதுவாக, NIO அமைப்பைப் பயன்படுத்த, I/O நிறுவனத்திற்கான சேனலையும், தரவைச் சேமிப்பதற்கான இடையகத்தையும் பெறுவீர்கள். பின்னர் நீங்கள் இடையகத்துடன் பணிபுரிகிறீர்கள், தேவைக்கேற்ப தரவை உள்ளிடுதல் அல்லது வெளியிடுதல்.
நீங்கள் ஒரு பஃபரில் முன்னோக்கி பின்னோக்கி நகர்த்தலாம், அதாவது இடையகத்தை "நடக்க", இது ஸ்ட்ரீம்களில் உங்களால் செய்ய முடியாத ஒன்று. இது தரவை செயலாக்கும்போது அதிக நெகிழ்வுத்தன்மையை அளிக்கிறது. நிலையான நூலகத்தில், இடையகங்கள் சுருக்க இடையக வகுப்பு மற்றும் அதன் பல வழித்தோன்றல்களால் குறிப்பிடப்படுகின்றன :
- பைட்பஃபர்
- சார்பஃபர்
- ஷார்ட்பஃபர்
- IntBuffer
- FloatBuffer
- DoubleBuffer
- லாங்பஃபர்
துணைப்பிரிவுகளுக்கிடையேயான முக்கிய வேறுபாடு, அவை சேமிக்கும் தரவு வகை - பைட்டுகள் , எண்கள் , நீளங்கள் மற்றும் பிற பழமையான தரவு வகைகள்.
தாங்கல் பண்புகள்
ஒரு தாங்கல் நான்கு முக்கிய பண்புகளைக் கொண்டுள்ளது. இவை திறன், வரம்பு, நிலை மற்றும் குறி.
கொள்ளளவு என்பது பஃப்பரில் சேமிக்கப்படும் அதிகபட்ச தரவு/பைட்டுகளின் அளவு. ஒரு இடையகத்தின் திறனை மாற்ற முடியாது . ஒரு இடையகம் நிரம்பியவுடன், அதற்கு மேலும் எழுதும் முன் அதை அழிக்க வேண்டும்.
எழுதும் பயன்முறையில், ஒரு இடையகத்தின் வரம்பு அதன் கொள்ளளவுக்கு சமமாக இருக்கும், இது இடையகத்திற்கு எழுதக்கூடிய அதிகபட்ச தரவைக் குறிக்கிறது. வாசிப்பு பயன்முறையில், இடையக வரம்பு என்பது இடையகத்திலிருந்து படிக்கக்கூடிய அதிகபட்ச தரவைக் குறிக்கிறது.
நிலை இடையகத்தில் கர்சரின் தற்போதைய நிலையைக் குறிக்கிறது . தொடக்கத்தில், இடையகத்தை உருவாக்கும்போது அது 0 ஆக அமைக்கப்படும். வேறு வார்த்தைகளில் கூறுவதானால், படிக்க அல்லது எழுதப்பட வேண்டிய அடுத்த உறுப்புகளின் குறியீடாகும்.
கர்சர் நிலையைச் சேமிக்க குறி பயன்படுத்தப்படுகிறது . ஒரு இடையகத்தை நாம் கையாளும்போது, கர்சர் நிலை தொடர்ந்து மாறுகிறது, ஆனால் நாம் அதை எப்போதும் முன்பு குறிக்கப்பட்ட நிலைக்குத் திரும்பப் பெறலாம்.
ஒரு இடையகத்துடன் வேலை செய்வதற்கான முறைகள்
இப்போது சேனல்களில் இருந்து தரவைப் படிக்கவும் எழுதவும் எங்கள் இடையகத்துடன் (மெமரி பிளாக்) வேலை செய்யும் முக்கிய முறைகளைப் பார்ப்போம்.
-
ஒதுக்கீடு (int திறன்) - இந்த முறை குறிப்பிட்ட திறன் கொண்ட ஒரு புதிய இடையகத்தை ஒதுக்க பயன்படுகிறது. ஒதுக்கு () முறையானது ஒரு IllegalArgumentException ஐ அனுப்பும் திறன் எதிர்மறை முழு எண்ணாக இருந்தால்.
-
திறன்() தற்போதைய இடையகத்தின் திறனை வழங்குகிறது .
-
நிலை() தற்போதைய கர்சர் நிலையை வழங்குகிறது. படிக்க மற்றும் எழுதும் செயல்பாடுகள் கர்சரை இடையகத்தின் இறுதிக்கு நகர்த்துகின்றன. வருவாய் மதிப்பு எப்போதும் வரம்பை விட குறைவாகவோ அல்லது சமமாகவோ இருக்கும்.
-
எல்லை() தற்போதைய இடையக வரம்பை வழங்குகிறது.
-
மார்க்() தற்போதைய கர்சர் நிலையை குறிக்க (சேமிக்க) பயன்படுகிறது.
-
reset() கர்சரை முன்பு குறிக்கப்பட்ட (சேமித்த) நிலைக்குத் திரும்பும்.
-
clear() நிலையை பூஜ்ஜியமாக அமைக்கிறது மற்றும் திறன் வரம்பை அமைக்கிறது. இந்த முறை பஃபரில் உள்ள தரவை அழிக்காது . இது நிலை, வரம்பு மற்றும் குறி ஆகியவற்றை மட்டுமே மீண்டும் துவக்குகிறது.
-
flip() இடையகத்தை எழுதும் பயன்முறையிலிருந்து வாசிப்பு முறைக்கு மாற்றுகிறது. இது தற்போதைய நிலைக்கு வரம்பை அமைத்து பின்னர் நிலையை மீண்டும் பூஜ்ஜியத்தில் வைக்கிறது.
-
read() — சேனலில் இருந்து இடையகத்திற்கு தரவை எழுத சேனலின் வாசிப்பு முறை பயன்படுத்தப்படுகிறது, அதே சமயம் இடையகத்தின் புட்() முறை இடையகத்திற்கு தரவை எழுத பயன்படுகிறது.
-
எழுது() — சேனலின் எழுதும் முறை இடையகத்திலிருந்து சேனலுக்கு தரவை எழுத பயன்படுத்தப்படுகிறது, அதே சமயம் இடையகத்தின் பெறு() முறை இடையகத்திலிருந்து தரவைப் படிக்கப் பயன்படுகிறது.
-
rewind() bufferஐ ரிவைண்ட் செய்கிறது. நீங்கள் இடையகத்தை மீண்டும் படிக்க வேண்டியிருக்கும் போது இந்த முறை பயன்படுத்தப்படுகிறது - இது நிலையை பூஜ்ஜியமாக அமைக்கிறது மற்றும் வரம்பை மாற்றாது.
இப்போது சேனல்களைப் பற்றி சில வார்த்தைகள்.
ஜாவா NIO இல் உள்ள மிக முக்கியமான சேனல் செயலாக்கங்கள் பின்வரும் வகுப்புகளாகும்:
-
FileChannel — ஒரு கோப்பிலிருந்து/ஒரு கோப்பிலிருந்து தரவைப் படிக்கவும் எழுதவும் ஒரு சேனல்.
-
DatagramChannel — இந்த வகுப்பு UDP (User Datagram Protocol) வழியாக நெட்வொர்க்கில் தரவைப் படிக்கிறது மற்றும் எழுதுகிறது.
-
சாக்கெட் சேனல் - TCP (டிரான்ஸ்மிஷன் கண்ட்ரோல் புரோட்டோகால்) வழியாக நெட்வொர்க்கில் தரவைப் படிக்கவும் எழுதவும் ஒரு சேனல்.
-
ServerSocketChannel — ஒரு வலை சேவையகம் செய்வது போலவே, TCP இணைப்புகளில் தரவைப் படிக்கவும் எழுதவும் ஒரு சேனல். ஒவ்வொரு உள்வரும் இணைப்பிற்கும் ஒரு சாக்கெட் சேனல் உருவாக்கப்படுகிறது.
பயிற்சி
ஓரிரு வரிகளை எழுத வேண்டிய நேரம் இது. முதலில், கோப்பைப் படித்து அதன் உள்ளடக்கங்களை கன்சோலில் காண்பிப்போம், பின்னர் கோப்பில் சில சரங்களை எழுதுவோம்.
குறியீட்டில் நிறைய கருத்துகள் உள்ளன - அனைத்தும் எவ்வாறு செயல்படுகின்றன என்பதைப் புரிந்துகொள்ள அவை உங்களுக்கு உதவும் என்று நம்புகிறேன்:
// Create a RandomAccessFile object, passing in the file path
// and a string that says the file will be opened for reading and writing
try (RandomAccessFile randomAccessFile = new RandomAccessFile("text.txt", "rw");
// Get an instance of the FileChannel class
FileChannel channel = randomAccessFile.getChannel();
) {
// Our file is small, so we'll read it in one go
// Create a buffer of the required size based on the size of our channel
ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
// Read data will be put into a StringBuilder
StringBuilder builder = new StringBuilder();
// Write data from the channel to the buffer
channel.read(byteBuffer);
// Switch the buffer from write mode to read mode
byteBuffer.flip();
// In a loop, write data from the buffer to the StringBuilder
while (byteBuffer.hasRemaining()) {
builder.append((char) byteBuffer.get());
}
// Display the contents of the StringBuilder on the console
System.out.println(builder);
// Now let's continue our program and write data from a string to the file
// Create a string with arbitrary text
String someText = "Hello, Amigo!!!!!";
// Create a new buffer for writing,
// but let the channel remain the same, because we're going to the same file
// In other words, we can use one channel for both reading and writing to a file
// Create a buffer specifically for our string — convert the string into an array and get its length
ByteBuffer byteBuffer2 = ByteBuffer.allocate(someText.getBytes().length);
// Write our string to the buffer
byteBuffer2.put(someText.getBytes());
// Switch the buffer from write mode to read mode
// so that the channel can read from the buffer and write our string to the file
byteBuffer2.flip();
// The channel reads the information from the buffer and writes it to our file
channel.write(byteBuffer2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
NIO API ஐ முயற்சிக்கவும் - நீங்கள் அதை விரும்புவீர்கள்!
GO TO FULL VERSION