2014-11-13 3 views
0

코드 조각을 리팩토링하는 데 문제가 있습니다. 나는 막연하게 문제를 이해하지만 좀 더 통찰력이나 설명이 내 이해와 문제 해결에 도움이 될 것입니다. 원래 코드 덩어리MemoryStream을 확장 할 수 없습니다 ... FileStream에서 MemoryStream 또는 유사한 리팩토링

첫째 :

FileStream fS = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite); 
Int64 fSLength = fS.Length; 
Int64 remainingNotFulEncDecBlock = fSLength % 1; 
fS.Seek(0, SeekOrigin.End); 
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock; 

Byte fillByte = (Byte)'$'; 

    for (Int32 i = 0; i < nrBytesToAdd - 1; i++) 
    fS.WriteByte(fillByte); 
    fS.WriteByte((Byte)nrBytesToAdd); 
    fSLength = fS.Length; 
    fS.Close(); 

리팩터링의 유일한 목적은 우리가 더 이상 열 수있는 실제 파일이 없다는 것입니다. 대신 byte[]을 제공합니다.

MemoryStream fS = new MemoryStream(_data); 
Int64 fSLength = fS.Length; 
Int64 remainingNotFulEncDecBlock = fSLength % 1; 
fS.Seek(0, SeekOrigin.End); 
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock; 

Byte fillByte = (Byte)'$'; 
    for (Int32 i = 0; i < nrBytesToAdd - 1; i++) 
    fS.WriteByte(fillByte); 
    fS.WriteByte((Byte)nrBytesToAdd); 
    fSLength = fS.Length; 
    fS.Close(); 

위의 코드는 MemoryStream

fS.WriteByte((Byte)nrBytesToAdd); 

원래 내가 Google에 오류를했고 읽어 줄에 확장 할 수없는 오류가 발생합니다 :

여기 내 리팩토링 코드입니다. 이제 메모리 스트림이 특정 크기로 설정되었으므로이 의미가 있습니다. 내가 분명하지 않은 것은 어떻게 진행해야 하는가입니다. 내가 이렇게 나에게 그런 짓을 할 수 있도록 특정 크기로 설정되지 않은 다른 MemoryStream 객체를 생성 마십시오

MemoryStream ms = new MemoryStream(); 
ms.WriteByte((Byte)nrBytesToAdd); 

이 기술의 나의 독서는이 그러나 지정된 byte[]MemoryStream를 초기화보다 적은 성능이 좋은 것입니다 나타냅니다 I MemoryStream을 동적으로 확장하는 다른 방법을 모른다 (찾을 수 없음). 하나의 플러스는 현재 예측되는 미래에 들어오는 byte[]이 매우 작아서 느린 것은 성능에 큰 영향을주지 않을 것입니다.

+1

'MemoryStream'은 특정'byte []'버퍼로 초기화하지 않는 한, 크기를 조정할 수 있습니다 (즉, 여기에서 사용하는 것과 다른 방법으로 사용하십시오). 하지만 게시 한 코드는별로 의미가 없으므로 올바른 대답이 무엇인지 알기가 어렵습니다. 'fsLength % 1'은 항상 0을 반환하므로, 왜 귀찮게합니까? 그리고, nrBytesToAdd는 항상 1이고'i

답변

1

초기 용량을 사용하는 MemeoryStream constructor을 사용할 수 있습니다. 메모리 스트림이 배열에게 그것은 크기 제한의에 도달 할 때마다 확장 계속해야하지 않도록

MemoryStream fS = new MemoryStream(_data.Length); 

이 해당 크기의 내부 바이트 배열을 설정합니다. 메모리 스트림에 바이트를 추가 할 수 있습니다. 정적 인 바이트 [] 크기를 갖는 것만 큼 효과적이지는 않지만 아마도 차선책 일 것입니다.

관련 문제